xsl with sort example condicional xml xslt xslt-1.0

xml - with - xslt condicional



¿Cómo salir de xsl: for-each loop en XSLT? (1)

Estás pensando demasiado procesalmente. No necesitas romper; ni siquiera necesitas hacer un bucle.

Todo su procedimiento puede y debe reducirse a una sola expresión XPath:

string(contains(TEST/ABC/DEF/GHI/Row/*[self::JKL or self::MNO]/Category, ''123''))

Eso es. Sin bucle Sin descanso. Simplemente prueba contra el XML de entrada y una conversión opcional a cadena (que puede o no ser necesario en su contexto real).

Actualización después de OP agregado XML de entrada y XML de salida deseado:

Este XSLT,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <item> <xsl:if test="/xml/TEST/ABC/DEF/GHI/Row/ *[self::JKL or self::MNO]/Category = 123"> <cat>123</cat> </xsl:if> </item> </xsl:template> </xsl:stylesheet>

producirá el XML de salida solicitado,

<item> <cat>123</cat> </item>

si la condición original especificada procedimentalmente es verdadera 1 , o este XML de salida,

<item/>

de otra manera.

1 Me tomé la libertad de cambiar también de una cadena que contiene prueba a una prueba de igualdad de valores de cadena, que es más probable que se desee aquí (de lo contrario, "1234" y demás también satisfarían la prueba).

Entiendo que XSLT no permite que uno salga directamente de un bucle xsl:for-each , pero debe haber una manera fácil de agregar más condiciones para lograrlo. He visto mucho en línea en el mismo contexto, pero no puedo seguir adelante.

Quiero iterar a través de un conjunto de etiquetas XML y salir de la iteración para encontrar un valor en una etiqueta XML y usar ese valor en otra xsl:template . Por ejemplo,

<xsl:template name="categoryCheckTemplate"> <xsl:for-each select="TEST/ABC/DEF/GHI/Row"> <xsl:variable name="category"> <xsl:choose> <xsl:when test="JKL/Category"> <xsl:value-of select="JKL/Category"/> </xsl:when> <xsl:when test="MNO/Category"> <xsl:value-of select="MNO/Category"/> </xsl:when> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="(contains($category,''123''))"> <xsl:value-of select="''true''"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="''false''"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template>

Quiero usar el valor ''true'' de esta plantilla en otra plantilla, pero no quiero repetirlo en todo momento. Cada vez que sea cierto, necesito salir de la iteración.

Entrada XML

<xml> <TEST> <ABC> <DEF> <GHI> <Row> <JKL> <Category>123</Category> </JKL> </Row> <Row> <JKL> <Category>456</Category> </JKL> </Row> <Row> <JKL> <Category>789</Category> </JKL> </Row> <Row> <JKL> <Category>012</Category> </JKL> </Row> </GHI> </DEF> </ABC> </TEST> </xml>

Salida deseada

<item> <cat>123</cat> </item>

¿Alguien puede ayudar con este XSLT 1.0?