el problema es que sé cómo acceder a un nodo específico, pero no tengo idea de cómo acceder a un nodo si un hermano tiene un valor específico. ¿Puede ser algo como esto / a / cc / contains (/ a / bb = 'zz')?
HOE SENGKIANG
Respuestas:
100
No estoy seguro de por qué todo el mundo está consultando por hermanos, también puede verificar los <bb/>elementos que coincidan con el predicado del <a/>predicado de:
@HOESENGKIANG: debe hacer clic en la marca de verificación para "aceptar" esta respuesta, o la que crea que responde mejor a la pregunta.
LarsH
23
P: ¿Cómo seleccionar un nodo usando XPath si el nodo hermano tiene un valor específico?
Debido a que solo hay "ejes XPath" para los hermanos siguientes y los hermanos anteriores, puede usar uno de ellos si la posición es fija.
Pero mejor:
busque ccdónde el padre tiene un hijo bbcon valor 'zz':
No estoy seguro de lo que quiere decir con "solo" ejes XPath "para hermanos siguientes y hermanos anteriores". ¿Se refiere al hecho de que no existe un eje único para todos los hermanos?
LarsH
@LarsH: Sí, lo siento, (disculpe mi mal inglés :-() - eso era lo que estaba tratando de decir (porque la pregunta era para hermanos)
hr_117
6
En primer lugar, su ejemplo no es XML bien formado. Pasando por alto eso y que no describió muy bien sus intenciones (¿Qué es exactamente lo que desea seleccionar en qué condición?), Supongo que desea hacer esto:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Selecciona
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Explicación : Cualquiera bbque contenga una 'zz'cadena en todos los nodos secundarios de bbluego ir al nodo principal de ese bbuso .., ahora que podemos acceder al cctexto de retorno.
Respuestas:
No estoy seguro de por qué todo el mundo está consultando por hermanos, también puede verificar los
<bb/>
elementos que coincidan con el predicado del<a/>
predicado de:fuente
*-sibling
eje. +1 aunque.Lo que necesita es el
following-sibling
eje XPathPruebe el Xpath aquí: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
fuente
P: ¿Cómo seleccionar un nodo usando XPath si el nodo hermano tiene un valor específico?
Debido a que solo hay "ejes XPath" para los hermanos siguientes y los hermanos anteriores, puede usar uno de ellos si la posición es fija.
Pero mejor: busque
cc
dónde el padre tiene un hijobb
con valor'zz'
:fuente
//a[bb = 'zz']/cc
.En primer lugar, su ejemplo no es XML bien formado. Pasando por alto eso y que no describió muy bien sus intenciones (¿Qué es exactamente lo que desea seleccionar en qué condición?), Supongo que desea hacer esto:
Selecciona
TEXT VALUES OF ALL <CC> ELEMENTS //cc /text() THAT HAVE A PRECEDING SIBLING <BB> [preceding-sibling::bb ] THAT HAS TEXT VALUE EQUAL TO "zz" [text()="zz"]
Podrías escribir también es como
Mire la especificación , tiene algunos ejemplos muy legibles de los que aprenderá mucho.
fuente
// a: Selecciona todos los elementos 'a' sin importar dónde se encuentren.
// a / cc: Selecciona los elementos 'cc' que son hijos del elemento 'a' (sin importar dónde esté a).
..: Selecciona el padre del nodo actual.
[../bb='zz ']: donde el valor del elemento hermano' bb 'es zz.
Referencia: http://www.w3schools.com/xsl/xpath_syntax.asp
fuente
Otra solución para este problema es
//bb[contains(.,'zz')]/../cc/text()
Explicación : Cualquiera
bb
que contenga una'zz'
cadena en todos los nodos secundarios debb
luego ir al nodo principal de esebb
uso..
, ahora que podemos acceder alcc
texto de retorno.Espero que esa explicación no sea compleja.
fuente