xsl with when sort index for example ejemplo choose xml xslt for-loop

xml - with - xslt example



xsl: para cada contador de bucle (1)

¿Cómo guardo las iteraciones que ocurrieron en un xsl: for-each? (las variables en XSL son inmutables)

Mi objetivo es encontrar el número máximo de hijos para cualquier nodo en un nivel particular.

Por ejemplo, me gustaría imprimir que no hay más de 2 nodos de respuesta para ninguna pregunta en esta encuesta:

<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="testing.xsl"?> <Survey> <Question> <Response text="Website" /> <Response text="Print Ad" /> </Question> <Question> <Response text="Yes" /> </Question> </Survey> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <html> <head> </head> <body> <xsl:for-each select="Survey"> The survey has <xsl:value-of select="count(child::Question)"/> questions. <br /> <xsl:variable name="counter">0</xsl:variable> <xsl:for-each select="Question"> <!-- TODO: increment the counter ??????? --> </xsl:for-each> No more than <xsl:value-of select="$counter"/> responses were returned for any question. </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>


Uno no "guarda las iteraciones que ocurrieron en xsl: for-each" porque XSLT es un lenguaje funcional y las variables son inmutables.

La siguiente transformación encuentra el máximo deseado:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:call-template name="maximum"> <xsl:with-param name="pNodes" select="*/Question"/> </xsl:call-template> </xsl:template> <xsl:template name="maximum"> <xsl:param name="pNodes"/> <xsl:variable name="vNumNodes" select="count($pNodes)"/> <xsl:choose> <xsl:when test="$vNumNodes = 1"> <xsl:value-of select="count($pNodes[1]/Response)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="vHalf" select="floor($vNumNodes div 2)"/> <xsl:variable name="vMax1"> <xsl:call-template name="maximum"> <xsl:with-param name="pNodes" select="$pNodes[not(position() > $vHalf)]"/> </xsl:call-template> </xsl:variable> <xsl:variable name="vMax2"> <xsl:call-template name="maximum"> <xsl:with-param name="pNodes" select="$pNodes[position() > $vHalf]"/> </xsl:call-template> </xsl:variable> <xsl:value-of select= "$vMax1*($vMax1 >= $vMax2) + $vMax2*($vMax2 > $vMax1)"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>

Cuando se aplica en el documento XML proporcionado:

<Survey> <Question> <Response text="Website" /> <Response text="Print Ad" /> </Question> <Question> <Response text="Yes" /> </Question> </Survey>

el resultado deseado es producido:

2

Tenga en cuenta lo siguiente : La plantilla llamada " maximum " se llama recursivamente e implementa el DVC (principio de división y conquista) para minimizar la profundidad de la pila de recursión . La lista de nodos se divide en dos, los máximos de las dos listas se calculan (recursivamente) y se devuelve el mayor de los dos.