谁能解释一下两者之间有什么区别
/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)
我不认为[1 or 2]是评估你认为它是如何评估的。or适用于两个布尔值。我怀疑两者1并且2正在评估为真的。因此,这个表达式的计算结果为真,基本上什么都不做,并将返回所有元素。
通常,position()可以用于表达式中,[position() <= 5]而索引地址只能选择一个元素,例如[5].
[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-of和exists来确定给定位置是否包含在值序列中:
/root/a[exists(index-of((1,2), position()))]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3904 次 |
| 最近记录: |