XPath:获取包含奥巴马但不包含罗姆尼的文本

时间:2012-10-19 20:10:55

标签: xpath

我对XPath很新,所以请耐心等待。我有一个XPath表达式

'.//*[contains(.,"Obama")]/text()'

这让我得到了包含“奥巴马”的文字。但是,我还没弄清楚如何添加

and [not(contains(., "Romney"))]表达式而不会出现语法错误。怎么做?帮助很多!

2 个答案:

答案 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