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?