我对 XPath 很陌生,所以请耐心等待。我有一个 XPath 表达式
'.//*[contains(.,"Obama")]/text()'
这让我得到了包含“奥巴马”的文本。但是,我一直无法弄清楚如何添加
and [not(contains(., "Romney"))]
到表达式而不会出现语法错误。它是如何完成的?帮助很大!
我对 XPath 很陌生,所以请耐心等待。我有一个 XPath 表达式
'.//*[contains(.,"Obama")]/text()'
这让我得到了包含“奥巴马”的文本。但是,我一直无法弄清楚如何添加
and [not(contains(., "Romney"))]
到表达式而不会出现语法错误。它是如何完成的?帮助很大!
使用:
.//*[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()
是 *context-sensitive` 函数,通常在第 k 个和第 m 个谓词中使用时会产生不同的结果,其中 k != m
尝试这个:
'.//*[contains(.,"Obama")][not(contains(.,"Romney"))]/text()'
您可以一个接一个地放置任意数量的谓词:
[a][b][c]