2014-01-08 77 views
0

我在XPath中掙扎了一下。在SQL術語中,我試圖加入兩個列表,並使用另一個列表中的屬性從一個列表中選擇元素。XPath加入兩個元素

我的XML文檔:

<DOSSIER> 
    <PRODUCT_DEF> 
     <NUMBER>1</NUMBER> 
     <SHOW>true</SHOW> 
    </PRODUCT_DEF> 
    <PRODUCT_DEF> 
     <NUMBER>2</NUMBER> 
     <SHOW>false</SHOW> 
    </PRODUCT_DEF> 
    <CONTRACT> 
     <NUMBER>11</NUMBER> 
     <PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER> 
    </CONTRACT> 
    <CONTRACT> 
     <NUMBER>22</NUMBER> 
     <PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER> 
    </CONTRACT> 
    <CONTRACT> 
     <NUMBER>33</NUMBER> 
     <PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER> 
    </CONTRACT> 
    <CONTRACT> 
     <NUMBER>44</NUMBER> 
     <PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER> 
    </CONTRACT> 
</DOSSIER> 

所以我想選擇所有合同要素,其對應的PRODUCT_DEF/SHOW =真。 CONTRACT_DEF/VOLGNUM與CONTRACT/PRODUCT_DEF_NUMBER相關聯

在我嘗試加入這兩個元素之後,我認爲不可能在CONTRACT元素中突然引用完全不同的元素:

//CONTRACT[..//PRODUCT_DEF[NUMBER=./PRODUCT_DEF_NUMBER]/SHOW="true"] 

結果應該是兩個節點的列表,包含:

合同[NUMBER = 11],
合同[NUMBER = 44]

這甚至possibl è?也許我應該分兩步做?

感謝您的幫助!

回答

1

通常XPath使用//是一個錯誤(它搜索所有元素如此難以控制,而且速度也很慢)。

  1. 基本選擇/DOSSIER/CONTRACT[condition]這意味着condition將具有其CONTRACT元素作爲上下文節點(這就是.將指)。因此

  2. 爲了得到在條件需要./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF/NUMBERPRODUCT_DEF節點,但是這意味着在產品的狀態任何子條件將使用NUMBER孩子爲背景,但可以申請的條件到PRODUCT_DEF節點。因此

  3. 期待你需要的東西,如:

    /DOSSIER/CONTRACT[./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF[./SHOW = 'true']/NUMBER] 
    

不過,我可能會改變,要使用絕對路徑爲PRODUCT_DEF,以及丟棄不必要./,使之更容易看到什麼繼續:

/DOSSIER/CONTRACT[PRODUCT_DEF_NUMBER = /DOSSIER/PRODUCT_DEF[SHOW = 'true']/NUMBER] 

PS。我討厭所有大寫,爲什麼有些人想要保留古代系統的這種人造物?因此可能有錯別字。

+0

嗯,是的,這是訣竅。謝謝! P.S.蓋帽的東西,是的,我知道,但這就是我必須與之合作。 – Denno

+0

Re Caps @Denno BTDTGTTS因此評論。 – Richard