【问题标题】:How to use two xpath inside xpath contains function如何在 xpath 中使用两个 xpath 包含函数
【发布时间】:2011-03-15 05:32:00
【问题描述】:

我有一个这样的下拉框:

<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 表达式来获取选项 value="B002VYJB5S",该表达式会根据选项标题属性检查产品名称 div。像这样的:

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

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

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

谢谢 拉姆

【问题讨论】:

  • @ 和 name 之间的空格是错字吗?
  • 这只是我的错字。仅包含不起作用的函数,否则您可以建议 diff xpath 表达式来获得所需的选项值。请随时提出任何澄清。谢谢
  • @user659956:我现在已经产生了最终的解决方案并提供了广泛的解释。
  • @user659956:那么,您是否尝试使用我的解决方案?

标签: xml xpath


【解决方案1】:

类似这样的:

<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 字符——但它们不包含在我们要选择的 option 元素的 title 属性中。

标准 XPath 函数 normalize-space() 会删除字符串中的所有开始和结束空格——我们使用它,它的结果实际上包含在option 元素的title 属性中。

【讨论】:

  • 嗨,Dimitre,我已经编辑了原始问题中的 html 部分,现在您可以编写自己的 xpath 来获取该值,因为我不确定我的 xpath 表达式是否正确。
  • +1 正确答案并扩展解释。我会删除最终的文本节点选择,只使用字符串值。
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 2021-04-05
  • 1970-01-01
  • 2023-03-09
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多