Announcement

Collapse
No announcement yet.

string in Elemente ausgeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • string in Elemente ausgeben

    Heidiho,

    ich hab bisher nichts im Forum gefunden und frage daher...

    Ich habe ganz vereinfacht folgende Ausgangs-xml:

    Code:
    <root>
      <node Produkt="Produkt1;Produkt2;Produkt3"/>
    </root>
    Das möchte ich in eine weitere XML umwandeln mit folgender struktur:
    Code:
    <root>
      <Produkte>
         <Produkt>Produkt1</Produkt>
         <Produkt>Produkt2</Produkt>
         <Produkt>Produkt3</Produkt>
      </Produkte>
    </root>
    dabei ist auch eine schwierigkeit, dass beliebig viele Produkte vorkommen können und nur XSLT 1.0 möglich ist.
    Es sieht so einfach aus und entweder ich steh total auf dem Schlauch oder es täuscht...
    Habe es folgendermaßen versucht, wobei ich mir schon rel. sicher war, dass das nicht klappen kann:

    Code:
    <xsl:element name="Produkte">
      <xsl:for-each select="node[substring-before(@Produkt, ';')]">
         <xsl:element name="Produkt">
             <xsl:value-of select="substring-before(@Produkt, ';')"/>
         </xsl:element>
       </xsl:for-each>
    </xsl:element>
    Hat jemand eine Idee? wär super, danke!

    Grüße
    Helix

  • #2
    Stichwort: Rekursion mit xsl:call-template. Ansatz:
    Code:
    <xsl:template match="/">
      <root>
        <Produkte>
          <xsl:call-template name="produkte">
            <xsl:with-param name="str" select="concat(root/node/@Produkt,';')"/>
          </xsl:call-template>
        </Produkte>
      </root>
    </xsl:template>
    
    <xsl:template name="produkte">
      <xsl:param name="str" select="$str"/>
      <xsl:if test="contains($str,';')">
        <Produkt>
          <xsl:value-of select="substring-before($str,';')"/>
        </Produkt>
        <xsl:call-template name="produkte">
          <xsl:with-param name="str" select="substring-after($str,';')"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    BTW: Bitte diese Unsitte der unnötigen Verwendung von xsl:element für literale Elemente sein lassen. Das bläht den Code nur auf. Erst zur dynamischen Erzeugung von Elementnamen, aus dem XML-Kontext heraus, wird xsl:element wirklich benötigt.

    Comment


    • #3
      Super, vielen Dank, funktioniert einwandfrei!

      Und auch für den Hinweis zu xsl:element, war mir vorher nicht ganz klar wann ich es brauche und wann nicht. Habe gleich mal alle überflüsseigen rausgelöscht!

      Comment

      Working...
      X