2012-10-19 31 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