任何人都可以解释
之间的区别/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();
}
}
}
答案 0 :(得分:4)
我认为[1 or 2]
正在评估您的评估方式。 or
适用于两个布尔值。我怀疑1
和2
正在评估为真。因此,这个表达式的评估是真实的,基本上什么都不做,并将返回所有元素。
通常,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-of
和exists
来确定给定位置是否包含在一系列值中:
/root/a[exists(index-of((1,2), position()))]
答案 3 :(得分:0)
[]
中的数值被视为索引。 OR
对像您这样的方式([1 or 2]
)的索引不起作用。正确的方法是使用position()
。