Hoe gebruik je XPath bevat() hier?

Ik probeer XPath te leren. Ik heb gekeken naar de andere contains()-voorbeelden hier, maar niets dat een AND-operator gebruikt. Ik krijg dit niet werkend:

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

Aan:

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

Antwoord 1, autoriteit 100%

U kijkt alleen naar het eerste li-kind in de zoekopdracht die u heeft in plaats van te zoeken naar een li-onderliggend element dat de tekst 'Model'. Wat u nodig heeft, is een zoekopdracht als de volgende:

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

Deze zoekopdracht geeft u de elementen die een class van featureList hebben met een of meer li-kinderen die de tekst bevatten, 'Model'.


Antwoord 2, autoriteit 29%

Ik heb mijn +1 al gegeven aan de oplossing van Jeff Yates.

Hier is een korte uitleg waarom uw aanpak niet werkt. Dit:

//ul[@class='featureList' en bevat(li, 'Model')]

ondervindt een beperking van de functie contains() (of een andere tekenreeksfunctie in XPath, wat dat betreft).

Het eerste argument zou een string moeten zijn. Als je het een knooppuntlijst geeft (als je het “li” geeft), moet er een conversie naar string plaatsvinden. Maar deze conversie wordt alleen gedaan voor het eerste knooppunt in de lijst.

In jouw geval is het eerste knooppunt in de lijst <li><b>Type:</b> Clip Fan</li> (omgezet naar een string: “Type: Clip Fan“) wat betekent dat dit:

//ul[@class='featureList' en bevat(li, 'Type')]

zou eigenlijk een knooppunt selecteren!


Antwoord 3, autoriteit 7%

Dit is een nieuw antwoord op een oude vraag over een veelvoorkomende misvatting over contains() in XPath…< /sup>

Samenvatting: contains() betekent bevat een subtekenreeks, niet bevat een knooppunt.

Gedetailleerde uitleg

Deze XPath wordt vaak verkeerd geïnterpreteerd:

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

Verkeerde interpretatie:
Selecteer die ul elementen die bevatten een li element met Model erin.

Dit is verkeerd omdat

  1. contains(x,y) verwacht dat x een string is, en
  2. de XPath-regel voor het converteren van meerdere elementen naar een string is deze:

    Een node-set wordt geconverteerd naar een string door de string-waarde te retourneren van
    de node in de node-set die als eerste in documentvolgorde staat. Als de
    node-set is leeg, er wordt een lege string geretourneerd.

Juiste interpretatie: selecteer die ul-elementen waarvan het eerste li kind een string-waarde die bevat een Model substring.

Voorbeelden

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

    Opmerking: het two ul element is niet geselecteerd omdat de tekenreekswaarde van het eerste li onderliggende element
    van de two ul is Foo, die de substring Model niet bevat.

  • //ul[li[contains(.,'Model')]] selecteert de one en two ul elementen.

    Opmerking: Beide ul-elementen zijn geselecteerd omdat contains() op elke li afzonderlijk wordt toegepast. (Zo wordt de lastige conversieregel van meerdere elementen naar tekenreeks vermeden.) Beide ul-elementen hebben een li-kind waarvan de tekenreekswaarde het Model substring — positie van het li element doet er niet meer toe.

Zie ook


Antwoord 4

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

Antwoord 5

Plak mijn contains voorbeeld hier:

//table[contains(@class, "EC_result")]/tbody

LEAVE A REPLY

Please enter your comment!
Please enter your name here

one × one =

Other episodes