如何在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 将使用该轴