Announcement

Collapse
No announcement yet.

Bestimmte Elemente aus einer Sequenz transformieren

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

  • Bestimmte Elemente aus einer Sequenz transformieren

    Hallo!

    Ich möchte gerne eine Sequenz folgender Art transformieren:

    Ausgansdokument:
    Code:
    <wurzel>
       <einheit>
           <art>test1</art>
           <wert>testwert1</wert>
       </einheit>
       ...
    </wurzel>
    Das Ausgangsdokument enthält eine Sequenz von "einheit"-Elementen. Manche "wert"-Kindelemente dieser "einheit"-Elemente (deren Kindelement "art" den Wert "test1", "test2" und "test3" hat) möchte ich in ein Zieldokument transformieren.

    Zieldokument:
    Code:
    <wurzel>
       <test1>testwert1</test1>
       <test2>testwert2</test2>
       <test3>testwert3</test3>
    </wurzel>
    Bisher habe ich das mit folgender XSLT-Anweisung versucht:
    Code:
    <xsl:stylesheet version="1.0" exclude-result-prefixes=" lxslt xsl java js" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="/">
    
        <xsl:apply-templates select="wurzel"/>
    
      </xsl:template>
    
      <xsl:template match="wurzel">
    
        <wurzel>
    
          <test1>
    
            <xsl:apply-templates select="//einheit[art=&apos;test1&apos;] "/>
    
          </test1>
    
          <test2>
    
            <xsl:apply-templates select="//einheit[art=&apos;test2&apos;]"/>
    
          </test2>
    
          <test3>
    
            <xsl:apply-templates select="//einheit[art=&apos;test3&apos;]"/>
    
          </test3>
    
        </wurzel>
    
      </xsl:template>
    
      <xsl:template name="einheit">
    
        <xsl:value-of select="wert"/>
    
      </xsl:template>
    
    </xsl:stylesheet>
    Das Problem dabei ist, dass das Zieldokument folgendermaßen aussieht:
    Code:
    <wurzel>
       <test1> test1 testwert1</test1>
       <test2> test2 testwert2</test2>
       <test3> test3 testwert3</test3>
    </wurzel>
    Wie bekomme ich es hin, dass die Namen der Elemente (test1, test2, test3) nicht nochmal dort auftauchen, sondern nur die Werte (testwert1, testwert2, testwert3)?
    Ist das überhaupt der richtige Ansatz, so wie ich das gemacht habe?

    Gruß und Dankeschön,
    shor

  • #2
    Probiere diesen Ansatz:
    Code:
    <xsl:template match="wurzel">
      <wurzel>
        <xsl:apply-templates select="einheit"/>
      </wurzel>
    </xsl:template>
    
    <xsl:template match="einheit">
      <xsl:apply-templates select="art[.='test1' or .='test2' or .='test3']"/>
    </xsl:template>
    
    <xsl:template match="art">
      <xsl:element name="{.}">
        <xsl:value-of select="following-sibling::wert"/>
      </xsl:element>
    </xsl:template>

    Comment


    • #3
      Hallo Thomas!

      Vielen Dank, dass tut genau das, was ich wollte und ist wesentlich eleganter als meine Lösung. Konnte Deinen Ansatz ganz gut nachvollziehen, das einzige was mir nicht ganz klar ist, ist der Sinn der geschweiften Klammern im "art" Template.

      Gruß und Dankeschön nochmals,
      shor

      Comment


      • #4
        {...} ist ein Attribute Value Template. Hier sollen dynamische Elementnamen erzeugt werden, welche sich aus dem Inhalt der art-Elemente ergeben (der Punkt steht für den Kontextknoten in art, also für test1 usw.).

        Comment


        • #5
          Nach Nachschlagen der ganzen Begriffe ist das jetzt auch klar. Glaub das war nicht so der optimale Einstieg in XSLT

          Danke nochmals.
          shor

          Comment

          Working...
          X