Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath-position()函数的缩写_Xpath - Fatal编程技术网

XPath-position()函数的缩写

XPath-position()函数的缩写,xpath,Xpath,有人能解释一下这两者的区别吗 /root/a[position()=1 or position()=2 及 ?? 我假设第二个是第一个的缩写形式,但Java XPath(Sun JDK 1.6.0)处理器却不这么认为。下面是我的测试应用程序 LBXML2库和DB2XPath处理器也认为这些路径不同。所以它看起来不像JDK bug import java.io.*; import javax.xml.xpath.*; import org.w3c.dom.*; import org.xml.

有人能解释一下这两者的区别吗

/root/a[position()=1 or position()=2

?? 我假设第二个是第一个的缩写形式,但Java XPath(Sun JDK 1.6.0)处理器却不这么认为。下面是我的测试应用程序

LBXML2库和DB2XPath处理器也认为这些路径不同。所以它看起来不像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();
        }
    }
}
import java.io.*;
导入javax.xml.xpath.*;
导入org.w3c.dom.*;
导入org.xml.sax.InputSource;
公共类XPathTest{
公共静态void main(字符串[]args)引发异常{
//字符串xpathStr=“/root/a[position()=1或position()=2]”;
字符串xpathStr=“/root/a[1或2]”;
XPathFactory xpf=XPathFactory.newInstance();
XPath xp=xpf.newXPath();
读卡器irdr=新的StringReader(
"");
InputSource isrc=新的InputSource(irdr);
XPathExpression expr=xp.compile(xpathStr);
对象结果=expr.evaluate(isrc、XPathConstants.NODESET);
节点列表节点=(节点列表)结果;
对于(int i=0;i
[1或2]
在.Net中也计算为“始终为真”谓词,因此此行为看起来是一致的:

下面是.NET3.5XMLDocument的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中,可以使用
exists的
索引来确定给定位置是否包含在一系列值中:

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

我不认为
[1或2]
正在评估您认为它是如何评估的
对两个布尔值起作用。我怀疑
1
2
的评估结果都是正确的。因此,此表达式的计算结果为true,基本上不做任何操作,并将返回所有元素


一般来说,
position()
可以用在
[position()这样的表达式中,
[]
中的数值被视为一个索引。
对索引的作用与您的方法不同(
[1或2]
)。如果方括号中的值是一个数字,正确的方法是使用
position()
,它被解释为
[position()=N]
。但是
[1或2]
不是一个数字,所以这条规则不适用。

如果“1”或“2”在用作“or”运算符的参数时总是计算为true,为什么它在被“[]”使用时有时计算为false(例如,当文档中不存在/root/path时)?@Anton:在这种情况下,它的计算结果仍然是
true()
,但是它必须过滤掉的节点集是空的节点集。对此我不确定。我的理解是,的内容(所谓的谓词)始终被认为是布尔表达式。如果整数('I'例如)在那里找到,它被扩展为布尔表达式,如…扩展为布尔表达式,如[position()=i]我还不太擅长使用注释marku。重试:-)我对此不确定。我的理解是,的内容(所谓的谓词)始终被认为是布尔表达式。如果整数('i'为例)在那里找到,它被扩展为布尔表达式,如
[position()=i]
,然后进行计算。这与我的发现一致,但不能解释为什么1或2有时被视为布尔值,有时被视为数字。我猜@Anton不会回来,但如果他回来了,他肯定会标记为正确
/root/a[exists(index-of((1,2), position()))]