Martin K.: for-each anfrage

Hallo,

ich habe folgendes Problem:
Folgende XML-Strutur:

<filter>
<set>
<get>
<set>
</set>
</get>
</set>
</filter>

Die "set" und "get" Knoten können dabei beliebig ineinandere verschachtelt sein und habe beide immer dieseleben Child-Knoten.

Ich würde diese gerne mit for.each ausgeben, in folgender Art und Weise.
Von oben nach unten durchgehen und jenachdem welchen Knoten kommt diesen ausgeben.

das geht irgendwie nicht, er findet den ersten nicht:

<xsl:for-each select="//filter//child::*">

xsl:choose
<xsl:when test="set">
<xsl:call-template name="SET"/>
</xsl:when>
<xsl:when test="GET">
<xsl:call-template name="GET"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>

Danke

  1. Hallo,

    Die "set" und "get" Knoten können dabei beliebig ineinandere verschachtelt sein und habe beide immer dieseleben Child-Knoten.

    Ich würde diese gerne mit for.each ausgeben, in folgender Art und Weise.
    Von oben nach unten durchgehen und jenachdem welchen Knoten kommt diesen ausgeben.

    das geht irgendwie nicht, er findet den ersten nicht:
    <xsl:for-each select="//filter//child::*">

    Jetzt bist du bereits im Kind-Knoten vom filter.

    xsl:choose
    <xsl:when test="set">

    Und jetzt überprüfst du ob <set|get> _in dem du ja bereits bist_, ein Kindelement <set> oder <get> hat dann rufst du deim Template auf. Sprich du übersprings immer eine Ebene.

    Eigentlich ist for-each unnötig. Du kannst das ganze mit:

    <xsl:template match="filter">
      <foobar>
       <xsl:apply-templates />
      </foobar>
     </xsl:template>
     <xsl:template match="set">
      <foo>
       <xsl:apply-templates />
      </foo>
     </xsl:template>
     <xsl:template match="get">
      <bar>
       <xsl:apply-templates />
      </bar>
     </xsl:template>

    erledigen.

    Grüße
    Thomas