gpt4 book ai didi

java - 如何在Saxon xquery中查询一个查询结果

转载 作者:行者123 更新时间:2023-11-29 04:48:22 26 4
gpt4 key购买 nike

我正在尝试使用 xquery 在 Saxon HE 9.7 中做一些基本的事情。我有一个返回一组元素的 xquery。然后我想分别查询每个元素。但我似乎无法弄清楚如何仅对该元素进行查询。我以为setContextItem()可以解决问题,但这不起作用。

我创建了一个简单示例来说明我的问题。我正在循环 <element>然后我想检索 <name>对于每个元素。但是我的查询没有返回任何内容,因为它实际上是在查询完整的 xml,而不仅仅是元素。如果我将内部查询更改为 //name它返回文档中的所有名称标签。

文件数据/example.xml:

<root>
<element>
<name>1</name>
</element>
<element>
<name>2</name>
</element>
</root>

Java代码:

public static void main(String[] args) throws SaxonApiException
{
Processor proc = new Processor(false);
XPathCompiler xpath = proc.newXPathCompiler();
DocumentBuilder builder = proc.newDocumentBuilder();
XdmNode rootNode = builder.build(new File("data/example.xml"));
String xquery = "/root/element";
XPathSelector selector = xpath.compile(xquery).load();
selector.setContextItem(rootNode);
for (XdmItem item : selector)
{
xquery = "/element/name";
XPathSelector selector2 = xpath.compile(xquery).load();
selector2.setContextItem(item);
System.out.println("item=" + item);
if (selector2.iterator().hasNext())
System.out.println("name=" + selector2.iterator().next());
else
System.out.println("Not found");
}
}

我的 Maven 依赖项:

<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>9.7.0-4</version>
</dependency>

结果:

item=<element>
<name>1</name>
</element>
Not found
item=<element>
<name>2</name>
</element>
Not found

最佳答案

在XPath中,开头的/总是引用文档节点。如果您希望您的 XPath(循环内的那个)尊重上下文元素,请尝试使其以句号 (.) 开头:

xquery = "./name";

或者完全删除 / * :

xquery = "name";

*) 这将适用于您的情况,因为 child:: 是默认轴,如果没有明确提及则将使用该轴

关于java - 如何在Saxon xquery中查询一个查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36350306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com