2011-08-25 164 views
1

我試圖執行XPATH查詢,這將允許我根據兩個條件選擇節點。使用XPATH選擇特定和唯一的屬性

首先我需要包含獨特屬性的值,第二,我需要的是一個含有特定屬性值節點的節點。

例如:

<rows> 
    <row value="0" id="130"/> 
    <row value="1" id="130"/> 
    <row value="2" id="130"/> 
    <row value="0" id="131"/> 
    <row value="1" id="131"/> 
    <row value="1" id="131"/> 
    <row value="2" id="131"/> 
    <row value="0" id="132"/> 
    <row value="1" id="132"/> 
    <row value="2" id="132"/> 
</rows> 

在這種情況下我想包含獨特的「價值觀」,但只有當他們也有ID =「131」的所有節點。我也想要第二個值='1'節點刪除。我期待這個結果:

<row value="0" id="131"/> 
<row value="1" id="131"/> 
<row value="2" id="131"/> 

這是可能的一個XPATH查詢嗎?

謝謝。

+0

請在我的回答中看到我的評論。我的xpath中有一個錯字。對於那個很抱歉。 –

回答

1

是的,但它不漂亮。可能有更好的方法,但這裏有:

/rows/row[@id='131'][(not(preceding-sibling::row[@id='131']) or not(following-sibling::row[@id='131'])) or 
         preceding-sibling::row[@id='131']/@value != @value and 
         following-sibling::row[@id='131']/@value != @value] 

下面是一個在輸入XML稍微複雜的版本上使用它的示例。 (我添加了另一個<row value="1" id="131"/>表明,它只返回唯一結果。)

輸入XML:

<rows> 
    <row value="0" id="130"/> 
    <row value="0" id="131"/> 
    <row value="0" id="132"/> 
    <row value="1" id="130"/> 
    <row value="1" id="131"/> 
    <row value="1" id="132"/> 
    <row value="2" id="130"/> 
    <row value="2" id="131"/> 
    <row value="2" id="132"/> 
    <row value="1" id="131"/> 
</rows> 

結果:

<row value="0" id="131"/> 
<row value="1" id="131"/> 
<row value="2" id="131"/> 
+0

感謝DevNull的努力,但該查詢仍然返回重複值。我想知道是否最好查詢id,然後遍歷結果並刪除重複值? – adampetrie

+0

@adampetrie - 你用什麼來執行查詢?我在oXygen XML Editor中測試了它,它工作正常。 –

+0

我還使用Dimitre的XPath Visualizer對其進行了測試:http://www.huttar.net/dimitre/XPV/TopXML-XPV.html,並按預期工作。 –

0

當然,你可以使用<的xsl:key>元素和key()函數。構造一個鍵,它是一個< row>元素的@value和@id屬性的組合,並且只選擇那些包含一個節點並且其@id屬性等於'131'(或其他)的'鍵集'。

<xsl:key name="id-key" match="row" use="concat(@value, '-', @id)" /> 

<xsl:template 
    match="row[count(key('id-key', concat(@value, '-', @id))) = 1 and @id='131']"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

很好玩,不是嗎?

瞭解更多關於在這裏:​​http://www.jenitennison.com/xslt/grouping/muenchian.html

編輯:對不起,我只是意識到你需要一個XPath查詢。注意自我:更仔細地閱讀問題。然而,答案仍然有用,所以我會放棄它。