2011-03-15 74 views
1

我有這樣一個下拉框,以便:如何使用兩個XPath的內部的XPath包含功能

<html> 
<body> 
<div class="dropdownlist"> 

<select name="childVariationASIN" style="width:180px;"> 


<option value="" selected="selected" title="Select">Select</option> 
<option value="B002VYJB5S" title="59 mm :: 101/13 Gold-Cream/Brown Gradient">Gold-Cre...</option> 
<option value="B00193CBMM" title="59 mm :: 103/11 Gunmetal-Grey/Grey Gradient">Gunmetal...</option> 
<option value="B003ENRWHE" title="59 mm :: 103/13 Gunmetal-Grey/Brown">Gunmetal...</option> 

</select> 
</div> 
<div id='selected_product_name'> 
Gold-Cream/Brown Gradient 
<div> 


</body> 
</html> 

而且具有顯示產品名稱,例如,另一個DIV 「金色奶油/棕色漸變」。

現在我需要通過定義XPath表達式來檢查產品名稱div與選項title屬性,以獲得選項value =「B002VYJB5S」。類似這樣的:

<xpath expression="//select[@name='childVariationASIN']/option[@value!='' and @title[contains(//div[@id='selected_product_name']/text()) " > 

此「包含」部分不工作。我怎樣才能得到相應的期權價值「B002VYJB5S」?

,我不知道這一點XPath表達式是正確的

感謝 拉姆

+0

「@」和「name」之間的空格是否是拼寫錯誤? – 2011-03-15 05:49:50

+0

這是我的錯字這裏只。包含函數只能不工作orelse你可以建議diff xpath表達式來獲得所需的選項值。請隨時詢問任何澄清。謝謝 – user659956 2011-03-15 05:54:44

+0

@ user659956:我現在已經制定了最終的解決方案,並提供了廣泛的解釋。 – 2011-03-15 13:17:35

回答

3

事情是這樣的:

<xpath expression= 
"//select[@ name='childVariationASIN'] 
      /option[@value!='' 
       and 
       @title[contains(.,//div[@id='selected_product_name']/text()) 

" > 

這種 「包含」 部分這麼想的工作。

沒有向我們展示針對的XPath表達式求值的XML文檔,我們只能儘量去猜測原因 ...

很可能

//div[@id='selected_product_name']/text()

選擇多個文本節點(如只有空白的文本節點),而想要的文本節點並不是第一個。

或者,想要的文本節點不是div的孩子,而只是其後代。

或者,...

UPDATE:該任擇議定書已經向我們展示了XML文檔。

我們高興地瞬間發現並解決問題的XPath表達式:

//select[@ name='childVariationASIN'] 
    /option[@value!='' 
      and 
      @title 
      [contains(.,normalize-space(//div[@id 
               = 
               'selected_product_name' 
               ] 
               /text() 
              ) 
         ) 
       ] 
      ] 

如果你不相信這個表達式選擇想要的節點,這裏是一個簡單的驗證嘗試:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    " //select[@ name='childVariationASIN'] 
     /option[@value!='' 
       and 
       @title 
       [contains(.,normalize-space(//div[@id 
                = 
                'selected_product_name' 
                ] 
                /text() 
              ) 
          ) 
        ] 
      ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

當施加在提供的XML文檔

<html> 
    <body> 
     <div class="dropdownlist"> 
      <select name="childVariationASIN" style="width:180px;"> 
       <option value="" selected="selected" title="Select">Select</option> 
       <option value="B002VYJB5S" title="59 mm :: 101/13 Gold-Cream/Brown Gradient">Gold-Cre...</option> 
       <option value="B00193CBMM" title="59 mm :: 103/11 Gunmetal-Grey/Grey Gradient">Gunmetal...</option> 
       <option value="B003ENRWHE" title="59 mm :: 103/13 Gunmetal-Grey/Brown">Gunmetal...</option> 
      </select> 
     </div> 
     <div id='selected_product_name'> 
       Gold-Cream/Brown Gradient 
      </div> 
    </body> 
</html> 

想要的,正確的結果產生:

<option value="B002VYJB5S" 
    title="59 mm :: 101/13 Gold-Cream/Brown Gradient">Gold-Cre...</option> 

說明

,我們希望我們選擇的節點包含div元素的文本子節點是:

<div id='selected_product_name'> 
Gold-Cream/Brown Gradient 
</div> 

正文:

" 
Gold-Cream/Brown Gradient 
" 

顯然,它包含一個開始和結束NL人物 - 但它們並不包含在我們要選擇的option元素的title屬性。

標準XPath函數normalize-space(),除其他事項外,從字符串中刪除所有的開始和結束的空白 - 我們使用它和它的結果真的包含在option元素的title屬性。

+0

嗨Dimitre我編輯了原有問題的HTML部分現在你可以編寫自己的xpath來獲得該值bcoz我不知道abt我的xpath表達式是正確的。 – user659956 2011-03-15 06:27:29

+0

+1正確的答案和擴展解釋。我會放棄最後的文本節點選擇,並使用字符串值。 – 2011-03-15 16:13:30