Dado este formato de datos simplificado:
<a>
<b>
<c>C1</c>
<d>D1</d>
<e>E1</e>
<f>don't select this one</f>
</b>
<b>
<c>C2</c>
<d>D2</d>
<e>E1</e>
<g>don't select me</g>
</b>
<c>not this one</c>
<d>nor this one</d>
<e>definitely not this one</e>
</a>
¿Cómo seleccionarías todos los C
s, D
sy E
s que son hijos de B
elementos?
Básicamente, algo como:
a/b/(c|d|e)
En mi propia situación, en lugar de a/b/
, la consulta que condujo a la selección de los C
, D
, E
nodos es en realidad bastante compleja así que me gustaría evitar hacer esto:
a/b/c|a/b/d|a/b/e
es posible?
or
es un operador lógico: opera con dos valores booleanos. El operador de unión XPath|
opera en dos conjuntos de nodos. Estos son bastante diferentes y hay casos de uso específicos para cada uno de ellos. El uso|
puede resolver el problema original, pero da como resultado una expresión XPath más larga y más compleja y desafiante. La expresión más simple en esta respuesta, que usa elor
operador, produce el conjunto de nodos deseado y puede especificarse en el atributo "select" de una<xsl:for-each>
operación XSLT. Solo inténtalo.local-name()
solo es correcto si queremos seleccionar todos los elementos con ese nombre local, independientemente del espacio de nombres en el que se encuentre el elemento. Este es un caso muy raro: en general, a las personas les importan las diferencias entre:kitchen:table
ysql:table
, o entrearchitecture:column
,sql:column
,array:column
,military:column
En su lugar, puede evitar la repetición con una prueba de atributo:
Contrariamente a la opinión antagónica de Dimitre, lo anterior no es incorrecto en un vacío donde el OP no ha especificado la interacción con espacios de nombres. El
self::
eje es restrictivo de espacio de nombres,local-name()
no lo es. Si la intención del OP es capturarc|d|e
independientemente del espacio de nombres (lo que sugeriría es incluso un escenario probable dada la naturaleza OR del problema), entonces es "otra respuesta que todavía tiene algunos votos positivos" que es incorrecta.No puede ser definitivo sin una definición, aunque me complace eliminar mi respuesta como realmente incorrecta si el OP aclara su pregunta de tal manera que soy incorrecta.
fuente
local-name()
, ¿eso significa que coincidiría con las etiquetas con cualquier espacio de nombres? Si lo usoself::
, ¿qué espacio de nombre tendría que coincidir? ¿Cómo coincidiría soloOhMy:c
?¿Por qué no
a/b/(c|d|e)
? Acabo de probar con la biblioteca XML de Saxon (bien envuelta con algo de bondad de Clojure), y parece funcionar.abc.xml
es el documento descrito por OP.fuente
No estoy seguro si esto ayuda, pero con XSL, haría algo como:
y este XPath no seleccionará todos los hijos de nodos B:
fuente