我有一个下拉框,如下:
<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表达式是否正确
由于 拉姆
答案 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
属性中元素。