Примерно так:
<xpath expression=
"//select[@ name='childVariationASIN']
/option[@value!=''
and
@title[contains(.,//div[@id='selected_product_name']/text())
" >
Эта "содержащая" часть не работает.
Не показывая нам XML-документ, по которому оценивается выражение XPath, мы можем только попытаться угадать причину ...
Вполне вероятно, что
//div[@id='selected_product_name']/text()
выбирает более одного текстового узла (например, текстового узла только для пробелов), и требуемый текстовый узел не оказывается первым.
Или, что искомый текстовый узел не является потомком div
, а просто его потомком.
Или, ...
ОБНОВЛЕНИЕ : ОП теперь показал нам документ 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()
, помимо прочего, удаляет все начальные и конечные пробелы из строки - мы используем ее, и ее результат действительно содержится в атрибуте title
элемента option
.