Estoy tratando de aprender XPath. Miré los otros contains()
ejemplos por aquí, pero nada que use un operador AND . No puedo hacer que esto funcione:
//ul[@class='featureList' and contains(li, 'Model')]
En:
...
<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>
...
Respuestas:
Sólo se busca en el primer
li
niño en la consulta que tiene lugar de buscar cualquierli
elemento secundario que pueda contener el texto,'Model'
. Lo que necesita es una consulta como la siguiente:Esta consulta le dará los elementos que tienen una
class
de lasfeatureList
con uno o másli
hijos que contienen el texto,'Model'
.fuente
li
conModel
enul
, entonces laand
condición fallará. Entonces laand
condición regresafalse
en el conjunto vacío, ¿es correcto?Ya le di mi +1 a la solución de Jeff Yates.
Aquí hay una explicación rápida de por qué su enfoque no funciona. Esta:
encuentra una limitación de la
contains()
función (o cualquier otra función de cadena en XPath, para el caso).Se supone que el primer argumento es una cadena. Si lo alimenta con una lista de nodos (darle "
li
" hace eso), debe realizarse una conversión a cadena. Pero esta conversión se realiza solo para el primer nodo de la lista.En su caso, el primer nodo de la lista es
<li><b>Type:</b> Clip Fan</li>
(convertido a una cadena: "Type: Clip Fan
") lo que significa que esto:en realidad seleccionaría un nodo!
fuente
Esta es una nueva respuesta a una vieja pregunta sobre un error común sobre
contains()
XPath ...Resumen:
contains()
significa que contiene una subcadena , no contiene un nodo .Explicación detallada
Este XPath a menudo se malinterpreta:
Interpretación incorrecta: seleccione aquellos
ul
elementos que contengan unli
elemento conModel
él.Esto está mal porque
contains(x,y)
esperax
ser una cadena yLa regla XPath para convertir múltiples elementos en una cadena es esta :
Interpretación correcta: seleccione aquellos
ul
elementos cuyo primerli
hijo tenga un valor de cadena que contenga unaModel
subcadena.Ejemplos
XML
XPaths
//ul[contains(li, 'Model')]
selecciona elone
ul
elementoNota: El
two
ul
elemento no está seleccionado porque el valor de cadena del primer elementoli
secundario detwo
ul
esFoo
, que no contiene laModel
subcadena.//ul[li[contains(.,'Model')]]
selecciona los elementosone
ytwo
ul
.Nota: Ambos
ul
elementos se seleccionan porquecontains()
se aplica a cada unoli
individualmente. (Por lo tanto, se evita la difícil regla de conversión de elementos múltiples a cadenas). Ambosul
elementos tienen unli
hijo cuyo valor de cadena contiene laModel
subcadena: la posición delli
elemento ya no importa.Ver también
fuente
fuente
Pega mi
contains
ejemplo aquí:fuente
table
elemento oEC_result
valor de clase en el código de OP. Esta respuesta no tiene sentido aquí y debe eliminarse.