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()))]