Announcement

Collapse
No announcement yet.

Attribute zu Elementen (selektiv und hierarchisch)

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

  • Attribute zu Elementen (selektiv und hierarchisch)

    Hallo,

    ich bin neu hier und hoffe auf diese Frage eine Antwort zu finden.
    Ich möchte folgendes XML in Abhängigkeit der Attribute transformieren (andere true/fals Kombinationen sind ebenfalls möglich und es gibt mehr als 2 Attribute (a-f))
    Code:
    <section>
        Test<cat a="true" b="false">text1</cat>
        Test<cat a="true" b="true">text2</cat>
    </section>
    Dies hier soll herauskommen:
    Code:
    <section>
        Test<x>text1</x>
        Test<x><y>text2</y></x>
    </section>
    Dabei ist x-a und y-b zugeordnet. Ich habe versucht es mit <xsl:apply-templates mode/> zu lösen, aber komme hier irgendwie nicht zum richten Ergbnis. Hat da jemand eine Idee?

    Vielen Dank
    Thorsten

  • #2
    Ansatz:
    Code:
    <xsl:template match="section">
      <section>
        <xsl:apply-templates/>
      </section>
    </xsl:template>
    
    <xsl:template match="cat[@a='true' and @b='false']">
      <x><xsl:value-of select="."/></x>
    </xsl:template>
    
    <xsl:template match="cat[@a='true' and @b='true']">
      <x><y><xsl:value-of select="."/></y></x>
    </xsl:template>

    Comment


    • #3
      Hallo Thomas,

      danke für den Ansatz. Etwas ähnliches hatte ich schon mal, dann jedoch verworfen, da dann ja wirklich alle Kombinationen der Werte a, b, c, d, e, f berücksichtigt werden müssen.

      Bin auf der Suche nach einer generischen Lösung ...

      Grüße
      Thorsten

      Comment


      • #4
        Probiere es mal so, die Attributnamen werden im true-Fall jeweils als Elementnamen verwendet:
        Code:
        <xsl:template match="section">
          <section>
            <xsl:apply-templates/>
          </section>
        </xsl:template>
        
        
        <xsl:template match="cat">
          <xsl:call-template name="attr2elem">
            <xsl:with-param name="attr" select="@*"/>
            <xsl:with-param name="max" select="count(@*)"/>
            <xsl:with-param name="akt" select="1"/>
          </xsl:call-template>
        </xsl:template>
        
        
        <xsl:template name="attr2elem">
          <xsl:param name="attr"/>
          <xsl:param name="max"/>
          <xsl:param name="akt"/>
        
          <xsl:if test="$akt &lt;= $max">
            <xsl:choose>
              <xsl:when test="$attr[$akt] = 'true'">
                <xsl:element name="{local-name($attr[$akt])}">
                  <xsl:call-template name="attr2elem">
                    <xsl:with-param name="attr" select="$attr"/>
                    <xsl:with-param name="max" select="$max"/>
                    <xsl:with-param name="akt" select="$akt + 1"/>
                  </xsl:call-template>
                  <xsl:if test="$akt = $max">
                    <xsl:value-of select="."/>
                  </xsl:if>
                </xsl:element>      
              </xsl:when>      
              <xsl:otherwise>
                <xsl:call-template name="attr2elem">
                  <xsl:with-param name="attr" select="$attr"/>
                  <xsl:with-param name="max" select="$max"/>
                  <xsl:with-param name="akt" select="$akt + 1"/>
                </xsl:call-template>
                <xsl:if test="$akt = $max">
                  <xsl:value-of select="."/>
                </xsl:if>     
              </xsl:otherwise>
            </xsl:choose> 
          </xsl:if>
        </xsl:template>

        Comment


        • #5
          Klasse! Danke, das funktioniert und hat mir ziemlich weitergeholfen :-)

          Comment

          Working...
          X