aussi simple que cela:
XSLT 1.0 solution:
Cette transformation:
<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="/">
<MyNums>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="1"/>
<xsl:with-param name="pEnd" select="10"/>
</xsl:call-template>
</MyNums>
</xsl:template>
<xsl:template name="generateNumNodes">
<xsl:param name="pStart"/>
<xsl:param name="pEnd"/>
<xsl:if test="$pEnd >= $pStart">
<xsl:variable name="vNumNodes"
select="$pStart -$pEnd+1"/>
<xsl:choose>
<xsl:when test="$vNumNodes = 1">
<MyNum><xsl:value-of select="$pStart"/></MyNum>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vHalf" select=
"floor(($pStart+$pEnd) div 2)"/>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="$pStart"/>
<xsl:with-param name="pEnd" select="$vHalf"/>
</xsl:call-template>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="$vHalf+1"/>
<xsl:with-param name="pEnd" select="$pEnd"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
lorsqu'il est appliqué sur tout document XML (non utilisé), produit désiré sortie:
<MyNums>
<MyNum>1</MyNum>
<MyNum>2</MyNum>
<MyNum>3</MyNum>
<MyNum>4</MyNum>
<MyNum>5</MyNum>
<MyNum>6</MyNum>
<MyNum>7</MyNum>
<MyNum>8</MyNum>
<MyNum>9</MyNum>
<MyNum>10</MyNum>
</MyNums>
Prenez note de ce qui suit:
Le modèlegenerateNumNodes
appels se récursive.
Cette récursivité est à la fois le temps (O(N))
, et dans l'espace (O(log2(N)))
efficace et ne pratiquement déborder la pile - pas SO ici!
La fonction ci-dessus est obtenue en mettant en œuvre la récursion dans un style DVC (DiVide and Conquer
) . Contrairement à tail-recursion
, il sera exécuté avec succès sur tout processeur XSLT conforme.
La profondeur de récursivité maximale requise pour générer 1000000 (un million de nombres) est seulement 19.
XSLT 2.0 solution:
Encore plus élémentaire, pas récursion, juste en utilisant le XPath 2.0 to
opérateur:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<MyNums>
<xsl:for-each select="1 to 10">
<MyNums>
<xsl:sequence select="."/>
</MyNums>
</xsl:for-each>
</MyNums>
</xsl:template>
</xsl:stylesheet>
S'il vous plaît donner plus d'indices Qu'est-ce qu'un ensemble de nœuds, ce os, la langue, etc. –
Une bonne question et la réponse à il peut être instructif de beaucoup de gens. –