2012-07-06 61 views
1

我必須找到在使用上的兩個型動物兩個標準的XML的值nodest使用XPath 1.0XPath表達式來模擬子查詢與多個creiteria

I'try到用一個例子說明:如果我們有下面的XML

<root> 
<obj> 
    <index>5</index> 
    <datalist> 
     <data> 
      <code>X</code> 
      <value>AAA</value> 
     </data> 
     <data> 
      <code>Y</code> 
      <value>BBB</value> 
     </data> 
    </datalist> 
</obj> 
<obj> 
    <index>3</index> 
    <datalist> 
     <data> 
      <code>Z</code> 
      <value>CCC</value> 
     </data> 
    </datalist> 
</obj> 
<obj> 
    <index>4</index> 
    <datalist> 
     <data> 
      <code>X</code> 
      <value>DDD</value> 
     </data> 
    </datalist> 
</obj> 
<obj> 
    <index>2</index> 
    <datalist> 
     <data> 
      <code>Y</code> 
      <value>EEE</value> 
     </data> 
    </datalist> 
</obj> 

我們願與<code=X>以檢索的<obj/data><value><obj>最小<index>內(在我們的exaple我們woult有d DD作爲結果)。

我曾嘗試下面的表達式,但它接縫到不行:

/root/obj[datalist/data/code='X'][not(preceding-sibling::obj/index <= index) 
and not(following-sibling::obj/index <= index)]/datalist/data/value 

,但它不工作

+1

請更改您的問題或檢查語法, 似乎有些東西丟失...... – 2012-07-06 13:45:59

+0

當「obj/index」爲4並且在sme時間有「 obj/index = 2'?這個矛盾使問題變得毫無意義。請修改並更正。 – 2012-07-06 16:49:17

+0

你是對的,我已經修復了這個例子,表明我找到了最小的obj/index,但是使用了obj/datalist/data/code = X – Icaro 2012-07-06 16:55:15

回答

4

相當,而在這盯着後,我想我已經想通了,這是怎麼回事。簡而言之,您在obj的初始匹配中執行code='X',但不在兄弟軸中執行。

換句話說,你說:「我找其中:a)具有較低的index沒有兄弟姐妹一個obj節點,和b)具有後代code='X'沒有節點符合這些標準

當然。你的意思是隻考慮兄弟姐妹是有後裔code='X',不是任何兄弟

試試這個(可運行在this XML Playground

root/obj[datalist/data/code='X'][ 
    not(preceding-sibling::obj[ 
     datalist/data/code='X' 
    ]/index &lt; index) 
    and 
    not(following-sibling::obj[ 
     datalist/data/code='X' 
    ]/index &lt; index) 
]/datalist/data/value 
+2

你已經達到了要求!您的xpath非常接近解決方案。我只用這種方式輕微地修改了你的表達式:「/ root/obj [datalist/data/code ='X'] [0121]索引<指數) 和 不(以下同胞:: OBJ [ 數據列表/數據/代碼= 'X' ] /索引<指數) ] /數據列表/數據[碼爲 'X'] /值」和現在它似乎爲我工作。非常感謝 – Icaro 2012-07-07 08:18:12