xsl when variable template for example ejemplos ejemplo choose xml xslt

xml - when - XSLT xsl: para cada selección condicional



xslt template (1)

Para permanecer con su código, debe ser tan simple como:

<xsl:for-each select="//tag2[subtag1/@att=''apple'']"> <apple> <seq_num><xsl:value-of select="position()" /></seq_num> <colour><xsl:value-of select="subtag2/subsubtag1" /></colour> <meal><xsl:value-of select="subtag2/subsubtag2" /></meal> </apple> </xsl:for-each>

Según los comentarios a continuación, como se sugiere, es mejor evitar // . Deberías poder cuando estés en el contexto correcto. Por ejemplo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/root"> <xsl:for-each select="tag2[subtag1/@att=''apple'']"> <apple> <seq_num><xsl:value-of select="position()" /></seq_num> <colour><xsl:value-of select="subtag2/subsubtag1" /></colour> <meal><xsl:value-of select="subtag2/subsubtag2" /></meal> </apple> </xsl:for-each> </xsl:template> </xsl:stylesheet>

Aplicado a su entrada, produce el mismo resultado. O aún mejor, evite el xsl:for-each también:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/root"> <xsl:apply-templates select="tag2[subtag1/@att=''apple'']"/> </xsl:template> <xsl:template match="tag2"> <apple> <seq_num><xsl:value-of select="position()" /></seq_num> <colour><xsl:value-of select="subtag2/subsubtag1" /></colour> <meal><xsl:value-of select="subtag2/subsubtag2" /></meal> </apple> </xsl:template> </xsl:stylesheet>

Tengo un pedazo de xml que se ve así:

<root> <tag1>tractor</tag1> <tag2> <subtag1 att="apple" /> <subtag2> <subsubtag1>red</subsubtag1> <subsubtag2>lunch</subsubtag2> </subtag2> </tag2> <tag1>forklift</tag1> <tag2> <subtag1 att="pear" /> <subtag2> <subsubtag1>green</subsubtag1> <subsubtag2>breakfast</subsubtag2> </subtag2> </tag2> <tag2> <subtag1 att="apple" /> <subtag2> <subsubtag1>green</subsubtag1> <subsubtag2>dinner</subsubtag2> </subtag2> </tag2> <tag1>combine harvester</tag1> </root>

Lo que necesito para transformarlo es que obtenga las subetiquetas 2 y 3 de cada nodo tag2, pero solo los nodos tag2 donde subtag1 es apple. También necesito un número de secuencia para cada uno.

Mi código actual se ve así:

<xsl:for-each select="//tag2"> <apple> <seq_num><xsl:value-of select="position()" /></seq_num> <colour><xsl:value_of select="subtag2" /></colour> <meal><xsl:value_of select="subtag3" /></meal> </apple> </xsl:for-each>

Esto estaría bien, excepto que necesito el for-each solo para devolver la etiqueta2 que son manzanas (es decir, subtag1 = apple). No puedo usar un xsl: if o un xsl: cuando porque entonces el número de secuencia sería inexacto para la segunda manzana.

¿Algunas ideas?

Gracias, Rik