2
A
回答
2
思考XPath表达式作为限定结果集 - 一组履行XPath表达式表示的所有要求的节点。 XPath表达式([]
内部的部分)的谓词或者对结果集没有影响,或者它们递增地缩小它。
换句话说,在下面的表达式:
//xyz[@abc="yes"]
[@abc="yes"]
降低定义为它的左侧结果集,通过//xyz
。
请注意,正如Michael Kay所建议的,下面所说的全部内容仅适用于至少具有一个位置谓词的XPath表达式。位置谓词可以是数字:[1]
或评估为一个数字,或者包含position()
或last()
。
如果不存在位置谓词,则XPath表达式中谓词的顺序不重要。
考虑以下简单的输入文件:
<root>
<a attr="other"/>
<a attr="foo"/>
<a attr="other"/>
<a attr="foo"/>
</root>
正如你所看到的,a[@attr = 'foo']
是不的root
的第一个子元素。如果我们将
//a[1]
这个文件,这当然会导致在
<a attr="other"/>
现在,关键的是,如果我们添加另一个谓词来表达,就像这样:
//a[1][@attr="foo"]
然后,[@attr="foo"]
只能影响已由//a[1]
定义的结果集。在这个结果集中,没有a[@attr="foo"]
- 最终结果是空的。
在另一方面,如果我们开始了与
//a[@attr="foo"]
结果将是
<a attr="foo"/>
-----------------------
<a attr="foo"/>
在这种情况下,如果我们添加第二个谓语:
//a[@attr="foo"][1]
第二个谓词[1]
可以缩小//a[@attr="foo"]
的结果集为仅包含t他第一个那些节点。
如果你知道XSLT,你可能会发现一个XSLT(和XPath 2.0)证明这是很有帮助的:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<result1>
<xsl:copy-of select="//a[1][@attr='foo']"/>
</result1>
<result2>
<xsl:copy-of select="//a[@attr='foo'][1]"/>
</result2>
</xsl:template>
</xsl:transform>
而其结果将是
<result1/>
<result2>
<a attr="foo"/>
</result2>
从技术上讲,只有XPath 1.0将此结果称为节点集。在XPath 2.0中,所有集合都成为节点的真实序列。
相关问题
- 1. 的XPath谓词组合多个元素
- 2. 带谓词的Xpath注释
- 3. 结合谓词的XPath
- 4. Xpath有多个谓词语句
- 5. 谓词不平等
- 6. NSFetchresultsController多谓词
- 7. 多对多谓词
- 8. 蚂蚁 - XmlTask - Xpath的谓词的xmlns
- 9. XPath选择带谓词的多个元素
- 10. 带有多个谓词的Xpath表达式
- 11. 使用嵌套XPath谓词...精制
- 12. 又一个.NET XPath谓词问题
- 13. 在HtmlAgilityPack,Xpath中使用谓词
- 14. 谓词总结孩子的价值
- 15. 建设谓词没有价值表达
- 16. 组合多个谓词
- 17. 谓词多个返回值
- 18. 使用基于另一个谓词的谓词的谓词过滤数组,这是谓词的关键
- 19. 谓词的ArrayList
- 20. Spring Data + QueryDSL空谓词+谓词链接
- 21. 核心数据多到许多谓词
- 22. 任何一对多一对多谓词
- 23. Antlr多余的谓词需要?
- 24. 的Java 8总结由多个谓词
- 25. 带多个谓词的Xcode UI测试
- 26. 带有后代和后代文本的XPath查询()谓词
- 27. 带有谓词和条件的XPath表达式
- 28. 如何匹配XPATH中谓词变量中的值
- 29. LINQ中的谓词
- 30. 的最大谓词
嗡嗡声。感谢您通知我。我从来没有想过你解释的方式。 – 2015-02-06 10:13:41
只要添加一个注释,谓词的顺序只有在至少其中一个是“位置”时才有意义。谓词是位置的,如果它评估为一个数字,或者它包含函数position()或last()上的调用。 – 2015-02-06 10:27:58
@MichaelKay你是对的,这是一个重要的说明,我应该提到这一点!我马上编辑我的答案。 – 2015-02-06 10:30:10