Primzahlen(XSL)
Aus IT074-Wiki
Der folgende Code-Schnipsel ermittelt alle Primzahlen von 2 bis zu einem übergebenen Wert (prim):
Primzahlen.xsl
<?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" version="1.0" encoding="UTF-8"/> <xsl:template match="/"> <xsl:value-of select="concat('Primzahlen bis einschliesslich ', prim, ' : ')"/> <xsl:call-template name="berechnePrim"> <xsl:with-param name="start" select="2"/> <xsl:with-param name="end" select="prim"/> <xsl:with-param name="mode" select="'erstelleListe'"/> </xsl:call-template> </xsl:template> <xsl:template name="berechnePrim"> <xsl:param name="start"/> <xsl:param name="end"/> <xsl:param name="srcliste"/> <xsl:param name="tmpliste"/> <xsl:param name="dstliste"/> <xsl:param name="teiler"/> <xsl:param name="mode"/> <xsl:variable name="cur" select="substring-before($srcliste, ';')"/> <xsl:choose> <xsl:when test="$mode='erstelleListe'"> <xsl:choose> <xsl:when test="$start>$end"> <xsl:call-template name="berechnePrim"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="$srcliste"/> <xsl:with-param name="mode" select="'berechnePrimzahlen'"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="berechnePrim"> <xsl:with-param name="start" select="$start+1"/> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="concat($srcliste, $start, ';')"/> <xsl:with-param name="mode" select="'erstelleListe'"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="$mode='berechnePrimzahlen'"> <xsl:choose> <xsl:when test="$cur*$cur>$end"> <xsl:value-of select="concat($dstliste, $srcliste)"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="berechnePrim"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="$srcliste"/> <xsl:with-param name="dstliste" select="$dstliste"/> <xsl:with-param name="teiler" select="$cur"/> <xsl:with-param name="mode" select="'bereinigeListe'"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="$mode='bereinigeListe'"> <xsl:choose> <xsl:when test="string-length(substring-before($srcliste, ';'))=0"> <xsl:call-template name="berechnePrim"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="substring-after($tmpliste,';')"/> <xsl:with-param name="dstliste" select="concat($dstliste, substring-before($tmpliste, ';'),';')"/> <xsl:with-param name="mode" select="'berechnePrimzahlen'"/> </xsl:call-template> </xsl:when> <xsl:when test="$cur<=$teiler or ($cur mod $teiler)!=0"> <xsl:call-template name="berechnePrim"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="substring-after($srcliste,';')"/> <xsl:with-param name="tmpliste" select="concat($tmpliste, $cur, ';')"/> <xsl:with-param name="dstliste" select="$dstliste"/> <xsl:with-param name="teiler" select="$teiler"/> <xsl:with-param name="mode" select="'bereinigeListe'"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="berechnePrim"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="srcliste" select="substring-after($srcliste,';')"/> <xsl:with-param name="tmpliste" select="$tmpliste"/> <xsl:with-param name="dstliste" select="$dstliste"/> <xsl:with-param name="teiler" select="$teiler"/> <xsl:with-param name="mode" select="'bereinigeListe'"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> </xsl:choose> </xsl:template> </xsl:stylesheet>
Einen Maximalwert könnte man beispielsweise mit Hilfe einer xml-Datei übergeben, die der obigen xsl-Datei zur Transformation übergeben wird:
Beispiel.xml
<?xml version="1.0" encoding="UTF-8"?> <prim>12</prim
Ein Aufruf dieser Kombination mit Hilfe von xmlstarlet könnte auf der bash etwa so aussehen:
xml tr Primzahlen.xsl Beispiel.xml
oder auf der Kommandozeile von Windows:
xml -s Primzahlen.xsl Beispiel.xml
oder mit xsltproc (beide Programme nutzen m. W. für die Transformation die libxslt):
xsltproc Primzahlen.xsl Beispiel.xml
mit dem Ergebnis:
Primzahlen bis einschliesslich 12 : 2;3;5;7;11;

