Angenommen, Sie haben eine hochsynthetische Aufgabe, um Zahlen von 1 bis 1.000.000 ohne entsprechende XML-Eingabe zu drucken. Natürlich scheitert die direkte Rekursion aufgrund von ironischem Stapelüberlauf.Drucken Sie Zahlen von einer auf eine Million
kam ich mit der Lösung bis unten aufgeführt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="end" select="number(1000000)"/>
<xsl:template match="/">
<xsl:call-template name="batches"/>
</xsl:template>
<xsl:template name="batches">
<xsl:param name="start" select="number(1)"/>
<xsl:param name="stop" select="$end"/>
<xsl:param name="ololo"/>
<xsl:if test="$start <= ($end)">
<xsl:choose>
<xsl:when test="$stop = 0">
<xsl:value-of select="$start"/>:<xsl:value-of select="$ololo"/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="batches">
<xsl:with-param name="start" select="$start"/>
<xsl:with-param name="stop" select="floor($stop div 2)"/>
<xsl:with-param name="ololo" select=" 'A' "/>
</xsl:call-template>
<xsl:call-template name="batches">
<xsl:with-param name="start" select="floor($stop div 2) + $start + 1"/>
<xsl:with-param name="stop" select="floor($stop div 2)"/>
<xsl:with-param name="ololo" select=" 'B' "/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Es funktioniert sowohl in libxslt und MSXML. Aber es druckt einige doppelte Zahlen und sieht ziemlich peinlich in Bezug auf die Effizienz aus. Kann das irgendwie verbessert werden?
Warum zweimal Sie "Chargen" Vorlage nennen? – TarasB
Es ist ein dumpfer (?) Versuch, das Divide and Conquer-Muster zu implementieren. – Flack
Gute Frage, +1. Siehe meine Antwort für eine umfassende Analyse und vollständige Lösungen. –