XPath-position()函数的缩写

Ant*_*ton 5 xpath

谁能解释一下两者之间有什么区别

/root/a[position()=1 or position()=2
Run Code Online (Sandbox Code Playgroud)

/root/a[1 or 2]
Run Code Online (Sandbox Code Playgroud)

?我假设2nd是1st的缩写形式,但是Java XPath(Sun JDK 1.6.0)处理器则认为不是这样。以下是我的测试应用程序。

libxml2库和db2 XPath处理器也认为这些路径不同。因此,它看起来不像是JDK错误。

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rus*_*sak 5

我不认为[1 or 2]是评估你认为它是如何评估的。or适用于两个布尔值。我怀疑两者1并且2正在评估为真的。因此,这个表达式的计算结果为真,基本上什么都不做,并将返回所有元素。

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


Stu*_*tLC 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]");
Run Code Online (Sandbox Code Playgroud)

编辑

在 XPath 2 中,您可以使用序列函数 index-ofexists来确定给定位置是否包含在值序列中:

/root/a[exists(index-of((1,2), position()))]
Run Code Online (Sandbox Code Playgroud)