2011-12-14 33 views
1

我擁有如下所示的XML。使用節點(或類似節點)的絕對路徑作爲密鑰獲得唯一結果集

<CONTAINER> 
    <SEARCHFOR /> 
    <ITEM/> 
    <ITEM/> 
    <ITEM/> 
    <ITEM/> 
    <ITEM/> 
    <CONTAINER> 
     <SEARCHFOR /> 
     <ITEM/> 
     <ITEM/> 
     <CONTAINER> 
      <SEARCHFOR /> 
      <ITEM id="1" /> 
      <ITEM/> 
      <ITEM/> 
      <CONTAINER> 
       <ITEM id="2" /> 
      </CONTAINER> 
     </CONTAINER> 
    </CONTAINER> 
</CONTAINER> 

我正在尋找與ITEM節點範圍最接近的SEARCHFOR節點。看我的其他問題,我的意思是在這裏。

Find nearest ancestor/sibling that matches criteria

我需要首先找到的感興趣的項目節點,然後從那裏工作了爲SEARCHFOR節點。換句話說,// SEARCHFOR作爲我的表達是不夠的。我有一個表達式,它將SEARCHFOR節點定位在距每個ITEM節點最近的範圍內。這工作得很好,看起來像......

for $v in 
    //ITEM  
return 
    ($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()] 

然而,結果列表中不是唯一的。我收到11個結果,每個ITEM節點都按預期結果。我想要一個只包含3個項目的獨特結果集。我已經在這裏看到了在XSL中使用分組的建議,但是我不能使用我正在使用的工具來做到這一點,但我可以使用XPath 2.0語法。我也看到使用normalize-space()來獲得獨特的結果,但是我的XML沒有任何文本。我的獨特性需要由每個節點的絕對路徑決定。

感謝您的任何援助, 邁克爾

回答

1

那麼只選擇那些item元素你有興趣(即具有SEARCHFOR那些):ITEM[ (ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()] ]/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()]。或者只需添加步驟/.即可。 (for $v in //ITEM
return ($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()])/.
,這應該消除任何重複。

+0

謝謝!添加(for ... return ...)/。訣竅。 – 2011-12-14 18:08:22