Вопрос по xml – Как использовать XPath содержит () здесь?

127

Я пытаюсь выучить xpath. Я посмотрел на другие примеры contains () здесь, но ничего, что использует оператор AND. Я не могу заставить это работать:

//ul[@class='featureList' and contains(li, 'Model')]

На:

...
<ul class="featureList">

<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
    Amps: 1.1
    Clip: Grips any surface up to 1.63"
    Plug: 3 prong grounded plug on heavy duty model
    Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>

<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...
Что работает для вас? ryeguy
это работает для меня, я проверял это наwhitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm mihi

Ваш Ответ

4   ответа
-5

Вставь мойcontains пример здесь:

//table[contains(@class, "EC_result")]/tbody
Error: User Rate Limit ExceededtableError: User Rate Limit ExceededEC_resultError: User Rate Limit ExceededThis answer makes no sense here and should be deleted.
55

Вот краткое объяснение, почему ваш подход не работает. Это:

//ul[@class='featureList' and contains(li, 'Model')]

сталкивается с ограничениемcontains() функция (или любая другая строковая функция в XPath, в этом отношении).

Первый аргумент должен быть строкой. Если вы передадите ему список узлов (предоставив его & quot;li& Quot; делает это), преобразование в строку должно иметь место. Но это преобразование выполняется только для первого узла в списке.

В вашем случае первый узел в списке<li><b>Type:</b> Clip Fan</li> (преобразовано в строку: & quot;Type: Clip Fan& quot;), что означает, что это:

//ul[@class='featureList' and contains(li, 'Type')]

будет на самом деле выбрать узел!

Error: User Rate Limit Exceeded
6

common misconception about contains() in XPath...

Резюме:contains() средстваcontains a substring, not contains a node.

Detailed Explanation

Этот XPath часто неверно истолковывается:

//ul[contains(li, 'Model')]

Wrong interpretation: Выберите теul элементы, которыеcontain li элемент сModel в этом.

Это неправильно, потому что

contains(x,y) expects x to be a string, and

the XPath rule for converting multiple elements to a string is this:

A node-set is converted to a string by returning the string-value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned.

Right interpretation: Выберите теul элементы которыхfirst li ребенок имеетstring-value тотcontains Model подстрока.

Examples

XML

<r>
  <ul id="one">
    <li>Model A</li>
    <li>Foo</li>
  </ul>
  <ul id="two">
    <li>Foo</li>
    <li>Model A</li>
  </ul>
</r> 

XPaths

//ul[contains(li, 'Model')] selects the one ul element.

Note: The two ul element is not selected because the string-value of the first li child of the two ul is Foo, which does not contain the Model substring.

//ul[li[contains(.,'Model')]] selects the one and two ul elements.

Note: Both ul elements are selected because contains() is applied to each li individually. (Thus, the tricky multiple-element-to-string conversion rule is avoided.) Both ul elements do have an li child whose string value contains the Model substring -- position of the li element no longer matters.

See also Testing text() nodes vs string values in XPath
181

li ребенок в запросе у вас вместо того, чтобы искать любойli дочерний элемент, который может содержать текст,'Model', Вам нужен запрос, подобный следующему:

//ul[@class='featureList' and ./li[contains(.,'Model')]]

Этот запрос даст вам элементы, которые имеютclass изfeatureList с одним или несколькимиli дети, которые содержат текст,'Model'.

Error: User Rate Limit ExceededliError: User Rate Limit ExceededModelError: User Rate Limit ExceededulError: User Rate Limit ExceededandError: User Rate Limit ExceededandError: User Rate Limit ExceededfalseError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы