如何在Saxon xquery中查询一个查询结果
How to query a query result in Saxon xquery
我正在尝试使用 xquery 在 Saxon HE 9.7 中做一些基本的事情。我有一个 returns 一组元素的 xquery。然后我想分别查询每个元素。但我似乎无法弄清楚如何仅对该元素进行查询。我以为 setContextItem()
可以解决问题,但这行不通。
我创建了一个简单示例来说明我的问题。我正在遍历 <element>
,然后我想为每个元素检索 <name>
。但是我的查询returns什么都没有,因为它实际上是在查询完整的xml,而不仅仅是元素。如果我将内部查询更改为 //name
它 returns 文档中的所有名称标签。
文件data/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::
是默认轴,如果明确提及 none 将使用该轴
我正在尝试使用 xquery 在 Saxon HE 9.7 中做一些基本的事情。我有一个 returns 一组元素的 xquery。然后我想分别查询每个元素。但我似乎无法弄清楚如何仅对该元素进行查询。我以为 setContextItem()
可以解决问题,但这行不通。
我创建了一个简单示例来说明我的问题。我正在遍历 <element>
,然后我想为每个元素检索 <name>
。但是我的查询returns什么都没有,因为它实际上是在查询完整的xml,而不仅仅是元素。如果我将内部查询更改为 //name
它 returns 文档中的所有名称标签。
文件data/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::
是默认轴,如果明确提及 none 将使用该轴