2013-10-04 108 views
0

考慮下面的XMLXPath表達式來選擇一個節點,如果屬性相匹配,或沒有該屬性節點否則

<xml> 
    <tag/> 
    <tag version="2.1"/> 
</xml> 

我想XPath 1.0表達式如果我搜索版本2.1返回<tag version="2.1"/>,和<tag/>如果我搜索2.2版本。

到目前爲止,我已經試過

/xml/tag[@version = '%version%' or not(@version)] 

其中%version%是可以是一個字符串或者2.1或2.2,但如果%version%是2.1,它返回兩個節點。

+1

在'2.1'上搜索會返回兩者,因爲在你的xpath中你做了或不做(@version)'而且這會導致沒有該屬性的標記。所以,不管你傳入'%version%',因爲總是'''將會因爲'或'語​​句而被返回......你想在一個XPath語句中實現的功能是不可能的。應該在代碼 –

回答

3

您可以使用這樣的事情,使用|(或)

/xml[not(tag[@version="2.1"])]/tag[not(@version)] | 
    /xml[tag[@version="2.1"]]/tag[@version="2.1"] 
  • 要麼xml沒有tag s的version="2.1",然後用無version屬性
  • 或者,如果返回tag小號xml確實包含tagversion="2.1",返回這些

因此,這將是你的情況

/xml[not(tag[@version='%version%'])] 
     /tag[not(@version)] 
    | 
    /xml[tag[@version='%version%']] 
     /tag[@version='%version%'] 
3

由於的XPath 2.0(如果相關)的替代非常漂亮@保羅的回答,您可以使用

if (/xml/tag[@version = '2.1']) then /xml/tag[@version = '2.1'] else /xml/tag[not(@version)] 

RESP。

if (/xml/tag[@version = '%version%']) then /xml/tag[@version = '%version'] else /xml/tag[not(@version)] 
+0

中解決這確實是一個非常好的選擇,不幸的是我不能使用xpath 2.0。我相應地更新了我的問題。 –

相關問題