使用count(preceding-sibling::*)
XPath表达式可以获得递增的计数器。但是,同样可以在两级深度序列中完成吗?
示例 XML 实例
<grandfather>
<father>
<child>a</child>
</father>
<father>
<child>b</child>
<child>c</child>
</father>
</grandfather>
代码(在 XPath 2.0 功能的 CLASSPATH 上使用 Saxon HE 9.4 jar)
尝试为具有不同类型 XPath 表达式的三个子节点获取 1,2 和 3 的计数器序列:
XPathExpression expr = xpath.compile("/grandfather/father/child");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++) {
Node node = nodes.item(i);
System.out.printf("child's index is: %s %s %s, name is: %s\n"
,xpath.compile("count(preceding-sibling::*)").evaluate(node)
,xpath.compile("count(preceding-sibling::child)").evaluate(node)
,xpath.compile("//child/position()").evaluate(doc)
,xpath.compile(".").evaluate(node));
}
上面的代码打印:
child's index is: 0 0 1, name is: a
child's index is: 0 0 1, name is: b
child's index is: 1 1 1, name is: c
我尝试的三个XPath中没有一个能够生成正确的序列:1、2、3。显然它可以使用循环变量轻松完成,但如果可能的话i
,我想用XPath完成它。此外,我需要保留评估XPath表达式的基本框架,以访问所有节点,然后在该集合上进行迭代,因为这是我处理的实际应用程序的结构方式。基本上我访问每个节点,然后需要在它( )或文档()上评估许多XPath表达式;这些XPATH表达式之一应该产生这个递增序列。node
doc