XPath - position()函数的缩写

时间:2011-09-23 07:42:01

标签: xpath

任何人都可以解释

之间的区别
/root/a[position()=1 or position()=2

/root/a[1 or 2]

? 我假设第2个是第1个的缩写形式,但Java XPath(Sun JDK 1.6.0)处理器则不这么认为。以下是我的测试申请。

libxml2库以及db2 XPath处理器也认为这些路径也不同。所以它看起来不像JDK bug。

import java.io.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

import org.xml.sax.InputSource;

public class XPathTest {
    public static void main(String[] args) throws Exception {
        //String xpathStr = "/root/a[position()=1 or position()=2]";
        String xpathStr = "/root/a[1 or 2]";

        XPathFactory xpf = XPathFactory.newInstance();
        XPath xp = xpf.newXPath();
        Reader irdr = new StringReader(
                "<root><a name=\"first\"/><a name=\"second\"/><a name=\"third\"/></root>");
        InputSource isrc = new InputSource(irdr);
        XPathExpression expr = xp.compile(xpathStr);
        Object result = expr.evaluate(isrc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);
            Element element = (Element) node;
            System.out.print(element.getNodeName() + " " + element.getAttributeNode("name"));
           System.out.println();
        }
    }
}

4 个答案:

答案 0 :(得分:4)

我认为[1 or 2]正在评估您的评估方式。 or适用于两个布尔值。我怀疑12正在评估为真。因此,这个表达式的评估是真实的,基本上什么都不做,并将返回所有元素。

通常,position()可以在[position() <= 5]这样的表达式中使用,而索引地址只能选择一个元素,如[5]

答案 1 :(得分:2)

如果方括号中的值是数字[N],则将其解释为[position()=N]。但[1 or 2]不是数字,因此此规则不适用。

答案 2 :(得分:1)

[1 or 2]也会在.Net中评估“始终为真”的谓词,因此这种行为看起来是一致的:

这是.NET 3.5 XmlDocument的XPath的输出

    // Returns first, second
    var ndl = dom.SelectNodes(@"/root/a[position()=1 or position()=2]");

    // Returns first, second and third
    ndl = dom.SelectNodes(@"/root/a[1 or 2]");

    // Returns first, second
    ndl = dom.SelectNodes(@"/root/a[1] | /root/a[2]");

修改

在XPath 2中,您可以使用sequence functions index-ofexists来确定给定位置是否包含在一系列值中:

/root/a[exists(index-of((1,2), position()))]

答案 3 :(得分:0)

[]中的数值被视为索引。 OR对像您这样的方式([1 or 2])的索引不起作用。正确的方法是使用position()