Siempre que la estructura del documento XML se sabe, es mejor evitar el uso de la //
XPath pseudo-operador, ya que su uso puede resultar en una gran ineficiencia (recorrido de toda la estructura del documento).
Por lo tanto, yo recomiendo este expresión XPath para el documento XML proporcionado:
/*/b[c]
Esto selecciona cualquier elemento b
que es un hijo del elemento superior del documento XML y que tiene un elemento hijo llamado c
.
ACTUALIZACIÓN: El PO hizo una pregunta secons hace unos minutos:
La segunda cuestión es que quiero combinar 2 condiciones: Quiero llegar el elemento que tiene name = "b2" y tiene el elemento C, pero esta sintaxis parece no funcionar: //b[@name='b2' and c]
la expresión XPath proporcionado hace seleccionar exactamente º e elemento deseado
Aquí es XSLT - basado verificación:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select="//b[@name='b2' and c]"/>
</xsl:template>
</xsl:stylesheet>
Cuando se aplica esta transformación en el documento XML proporcionado:
<a>
<b name = "b1"></b>
<b name = "b2"><c/></b>
<b name = "b3"></b>
</a>
la expresión XPath se evalúa y la correcta -seleccionado elemento se copia a la salida:
<b name="b2">
<c/>
</b>
¿Qué significa exactamente "parece que no funciona"? Haga una pregunta nueva y separada y proporcione el documento XML de origen completo (lo más pequeño posible), la expresión XPath utilizada y el resultado deseado y el resultado real que obtuvo. Con el documento XML actual, la expresión XPath '// b [@ name = 'b2' yc]' selecciona el segundo hijo de 'a', exactamente como debería. –