我对XPath很新,所以请耐心等待。我有一个XPath表达式
'.//*[contains(.,"Obama")]/text()'
这让我得到了包含“奥巴马”的文字。但是,我还没弄清楚如何添加
and [not(contains(., "Romney"))]
表达式而不会出现语法错误。怎么做?帮助很多!
答案 0 :(得分:1)
试试这个:
'.//*[contains(.,"Obama")][not(contains(.,"Romney"))]/text()'
您可以依次添加任意数量的谓词:
[a][b][c]
答案 1 :(得分:1)
使用强>:
.//*[contains(.,"Obama") and not(contains(.,"Romney"))]/text()
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select=
'.//*[contains(.,"Obama") and not(contains(.,"Romney"))]/text()'/>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<election>
<choice>Maybe Obama</choice>
<choice>Maybe Romney</choice>
</election>
评估XPath表达式并将所选节点复制到输出中:
Maybe Obama
请注意:
SomeExpression[x][y]
并不总是等同于:
SomeExpression[x and y]
因此,建议后者 - 而不是前者,正如@ChrisGerken在答案中指出的那样。
以下是具体示例:
我们有这个XML文档:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
和这两个XPath表达式:
/*/*[. mod 3 = 0 and position() = 3]
和强>
/*/*[. mod 3 = 0][position() = 3]
第一个表达式选择:
<num>03</num>
但是,第二个表达式选择:
<num>09</num>
这是一个完整的基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*[. mod 3 = 0 and position() = 3]"/>
================
<xsl:copy-of select=
"/*/*[. mod 3 = 0][position() = 3]"/>
</xsl:template>
</xsl:stylesheet>
当对上述XML文档应用此转换时,将评估两个XPath表达式,并将这些评估的结果复制到输出中:
<num>03</num>
================
<num>09</num>
<强>解释强>:
position()
是一个*上下文敏感的函数,当在第k个和第m个谓词中使用时通常会产生不同的结果,其中k!= m