Как использовать два xpath внутри xpath содержит функцию - PullRequest
1 голос
/ 15 марта 2011

У меня есть один выпадающий список, например:

<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".

Теперь мне нужно получитьзначение параметра = "B002VYJB5S" путем определения выражения XPath, которое проверяет, что имя продукта div соответствует атрибуту заголовка параметра.Примерно так:

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

Эта «содержащая» часть не работает.Как я могу получить соответствующее значение параметра "B002VYJB5S"?

, и я не уверен насчет правильного выражения xpath

Спасибо Ram

1 Ответ

3 голосов
/ 15 марта 2011

Примерно так:

<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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...