Pregunta

Fragmento XML:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

¿Cómo selecciono todos los nodos secundarios de <AA> eso tiene bar como su contenido?En el ejemplo anterior, me gustaría seleccionar <CC> y <EE>.Estoy pensando que la solución es algo como:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
¿Fue útil?

Solución

Una de las soluciones más simples a la pregunta del OP es la siguiente expresión XPath:

*/*[.='bar']

Tenga en cuenta que no se trata de ninguna instrucción XSLT; esto es solo una expresión XPath, por lo que la pregunta solo podría etiquetarse como XPath.

De ahora en adelante, se podría usar esta expresión XPath en XSLT de varias maneras, como por ejemplo para aplicar plantillas en todos los nodos seleccionados..

Por ejemplo, a continuación se muestra una transformación XSLT que toma el documento XML y produce otro, en el que todos los elementos (hijos de <AA> cuyo contenido no es igual a "bar" se eliminan:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Cuando esta transformación se aplica en el documento XML original:

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

se produce el resultado deseado:

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

tenga en cuenta:

En un patrón de coincidencia normalmente no necesitamos especificar una expresión XPath absoluta, sino sólo una relativa, por lo que la expresión XPath completa se simplifica naturalmente a este patrón de coincidencia:

*[. = 'bar']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top