Primzahlen(XSL)

Aus IT074-Wiki

Wechseln zu: Navigation, Suche

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&gt;$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&gt;$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&lt;=$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;

Siehe auch