2012-10-19 29 views
0

我对XPath颇为陌生,所以请耐心等待。我有一个XPath表达式XPath:获取包含奥巴马但不包含罗姆尼的文本

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

这让我包含“奥巴马”的文字。但是,我一直无法弄清楚如何将

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

+1

这是一个真正的IT问题,还是你只是在燃烧美国大选? –

+1

我只是一个法国青蛙,但'罗姆尼'似乎是一个错误的表达... –

+0

我建议你选择不同的字符串来搜索此问题之前关闭。 –

回答

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

+0

您能详细说明Chirs Gerken提供的ansewer的区别吗,还是仅差别的区别? – root

+0

@root,查看我的更新答案,其中Chris Gerken表达式推荐的示例可能会产生不想要的结果。 –

+0

谢谢你的深入解释,它比我希望找到的更多。 – root

1

试试这个:

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

你可以把尽可能多的断言,只要你喜欢一个又一个:

[a][b][c] 
+0

这得到“奥巴马诊断与'罗姆尼西亚'的竞争对手”,但否则它很好,谢谢。 – root

+0

但这就是你要求的,对吧? “罗姆尼西亚”与罗姆尼并不完全匹配。我希望你只是为讨论目的而使用不同的名字。这些特殊的字符串带来了相当多的情绪。 :) –

+0

只是开玩笑说“罗姆尼西亚”,嘿谁说的XPath应该不冷静。再次感谢您的帮助,您的回答为我解决了问题。 – root