2013-02-22 35 views
1

我正在尋找正確的xpath表達式來選擇所有節點的最近的祖先具有適當的屬性值,而不是選擇那些最近的祖先具有明確的'不選擇'屬性值。可視化解釋:對於每個分支,按照它的路徑到達根,並且在遇到某個屬性時第一次應該決定它是否在選擇中。xpath讓最近的祖先的屬性值決定它是否在

<xyz select="yes"> 
    <blabla>this one's in</blabla> 
    <qwerty select="no">this one's out 
     <foobar>out please!</foobar> 
     <gettingoutofnames select="yes">in again!</gettingoutofnames> 
    </qwerty> 
</xyz> 

示例可以發生在XML結構的任何地方。

元素的名稱可以是任何東西。 'select =「yes」'和'select =「no」'可以按照任何順序進行,但最深的是決定性的後代。

我想是這樣的:

//*[@select="yes"]//ancestor::*[not(@select="no")] 

但是,這並不趕上這一切。任何幫助表示讚賞!

回答

0

我認爲下面應該工作:

//*[ancestor::*[@select][1]/@select='yes'] 

分解:ancestor::*[@select][1]是具有select屬性的最近的祖先。因此,我們只選擇那些最近的具有select屬性的祖先將此屬性設置爲'yes'的節點。如果您還想要包含具有select="yes"屬性(在您的示例中爲xyzgettingoutofnames)的節點,則必須將ancestor替換爲ancestor-or-self

+0

這就是我一直在尋找的!非常尊重!在寫這篇文章的時候,我需要一個解決我的問題的快速解決方案,所以最後我解決了一個解決方法。這是關於需要翻譯的字符串的過濾。但是,由於此翻譯仍在進行中,我可以使用您的解決方案。謝謝! – 2013-02-27 09:39:38

0

爲了選擇一個值

cat //*[contains(@select,'yes')] 

對於選擇的否定結果

cat //*[not(contains(@select,'yes'))] 

希望你會找出捕捉您的問題

相關問題