如何在xpath中使用两个xpath包含函数

时间:2011-03-15 05:32:01

标签: xml 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,例如“Gold-Cream / Brown Gradient”。

现在我需要通过定义XPath表达式来获取选项value =“B002VYJB5S”,该表达式根据选项title属性检查产品名称div。像这样:

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

这个“包含”部分不起作用。如何获得相应的选项值“B002VYJB5S”?

我不确定xpath表达式是否正确

由于 拉姆

1 个答案:

答案 0 :(得分: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的子节点,而只是它的后代。

或者......,

更新:OP现在向我们展示了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字符 - 但它们不包含在我们要选择的title元素的option属性中。

标准XPath函数normalize-space()除其他外,从字符串中删除所有开始和结束空格 - 我们使用它并且其结果实际包含在{{1}的title属性中元素。