如何在Saxon xquery中查询查询结果

时间:2016-04-01 07:21:04

标签: java xpath saxon

我正在尝试使用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");
    }
}

My 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

1 个答案:

答案 0 :(得分:3)

在XPath中,开头的/始终引用文档节点。如果你想让你的XPath(循环中的那个)尊重上下文元素,试着让它以一个句号(.)开始:

xquery = "./name";

或者只是完全删除/ *:

xquery = "name";

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