Jak używać XPath contains () tutaj?

Próbuję nauczyć się xpath. Spojrzałem na inne przykłady contains (), ale nic, co używa operatora AND. Nie mogę tego uruchomić:

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

On:

...
<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>
...
 122
Author: abatishchev, 2009-06-30

4 answers

Patrzysz tylko na pierwsze li dziecko w zapytaniu, które masz, zamiast szukać dowolnego li elementu potomnego, który może zawierać tekst, 'Model'. To, czego potrzebujesz, to zapytanie takie jak:

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

To zapytanie daje elementy, które mają class z featureList z jednym lub więcej li dzieci, które zawierają tekst, 'Model'.

 171
Author: Jeff Yates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 13:07:44

Już dałem +1 do rozwiązania Jeffa Yatesa.

Oto szybkie wyjaśnienie, dlaczego twoje podejście nie działa. To:

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

Napotyka ograniczenie funkcji contains() (lub jakiejkolwiek innej funkcji łańcuchowej w XPath).

Pierwszy argument ma być łańcuchem znaków. Jeśli podasz mu listę węzłów (dając jej "li" robi to), musi nastąpić konwersja na string. Ale ta konwersja jest wykonywana tylko dla pierwszego węzła na liście.

W Twoim przypadku pierwszym węzłem na liście jest <li><b>Type:</b> Clip Fan</li> (konwertowany na ciąg znaków: "Type: Clip Fan"), co oznacza, że:

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

Rzeczywiście wybrać węzeł!

 55
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 18:33:12

jest to nowa odpowiedź na Stare pytanie o powszechne nieporozumienie o contains() w XPath...

Summary: contains() oznacza zawiera podłańcuch, nie zawiera węzeł .

Szczegółowe Wyjaśnienie

Nie jest to jednak możliwe, ponieważ nie jest to możliwe.]}
//ul[contains(li, 'Model')]

Błędna interpretacja: Wybierz te ul elementy, które zawierają element li z Model.

To jest źle ponieważ

  1. contains(x,y) oczekuje x być ciągiem, a
  2. Reguła XPath do konwersji wielu elementów na łańcuch jest to :

    Zbiór węzłów jest konwertowany na łańcuch znaków, zwracając wartość łańcucha z węzeł w zestawie węzłów, który jest pierwszy w porządku dokumentu . Jeśli node-set jest pusty, zwracany jest pusty łańcuch.

Interpretacja prawa: wybierz te ul elementy, których pierwszy li dziecko ma string-wartość że zawiera A Model substring.

Przykłady

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')] wybiera one ul element.

    Uwaga: The two ul element nie jest zaznaczony, ponieważ łańcuch-wartość pierwszego potomka li z two ul jest Foo, które nie zawiera podciąg Model.

  • //ul[li[contains(.,'Model')]] wybiera one itwo ul żywioły.

    Uwaga: oba elementy ul są wybierane, ponieważ {[2] } jest stosowane do każdego li indywidualnie. (W ten sposób unika się skomplikowanej reguły konwersji wielu elementów na ciąg znaków.) Oba elementy ul mają potomka li, którego wartość łańcuchowa zawiera Model podłańcuch -- pozycja elementu li nie ma już znaczenia.

Zobacz również

 5
Author: kjhughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-01 19:36:35

Wklej mój contains przykład tutaj:

//table[contains(@class, "EC_result")]/tbody
 -5
Author: hahakubile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 07:39:23