0

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

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

这让我得到了包含“奥巴马”的文本。但是,我一直无法弄清楚如何添加

and [not(contains(., "Romney"))]到表达式而不会出现语法错误。它是如何完成的?帮助很大!

4

2 回答 2

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()是 *context-sensitive` 函数,通常在第 k 个和第 m 个谓词中使用时会产生不同的结果,其中 k != m

于 2012-10-19T20:33:25.310 回答
1

尝试这个:

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

您可以一个接一个地放置任意数量的谓词:

[a][b][c]
于 2012-10-19T20:17:13.170 回答