Edi: for-each mit Ausgabe von spezifischen Elementen

Hallo,
ich habe folgendes Problem (hatte es vorhin fälschlicherweise als XML und nicht xsl Thema dargestellt).

Mein XML besteht aus einem CONFIG-Tag und den eigentlichen Daten (<Record>).
Im Config Tag stehen nur jene Spalten (<COL...>), welche ausgegeben werden müssen.
D.h. ich darf in diesem Falle nur field2 und field4 ausgeben, und zwar in der Reihenfolge, wie sie unter CONFIG vorkommen.
Idealerweise sollte die Spaltenüberschrift entsprechend "Head2" und "Head4" lauten.
Was muss im xsl for-each Block stehen, damit ich nur die in CONFIG/COL angegebenen Felder anzeige?

<DATA>
<CONFIG><COL elem="field2" name="Head2"/><COL elem="field4" name="Head 4"/></CONFIG>
<list>
  <Record>
    <field1>000000052169</field1>
    <field2>1.0</field2>
    <field3>20060113</field3>
    <field4>col4-1</field4>
    <field5>5</field5>
    <field6>20060520</field6>
  </Record>
.......
  <Record>
    <field1>000000052169</field1>
    <field2>2.0</field2>
    <field3>20060113</field3>
    <field4>col4-n</field4>
    <field5>5</field5>
    <field6>20060520</field6>
  </Record>
  </list>
 <DATA>

die Ausgabe sollte so sein:

Head2   Head4
1.0     col4-1
.....
2.0     col4-n

Danke für nützliche Hinweise.
Edmund

  1. Hallo Edmund,

    Was muss im xsl for-each Block stehen, damit ich nur die in CONFIG/COL angegebenen Felder anzeige?

    Probiere diesen Ansatz:

    <xsl:template match="DATA">  
      <xsl:apply-templates/>  
    </xsl:template>  
      
    <xsl:template match="CONFIG/COL">  
      <xsl:value-of select="@name"/><xsl:text>&#x9;</xsl:text>  
      <xsl:if test="position() = last()"><xsl:text>&#xA;</xsl:text></xsl:if>  
    </xsl:template>  
      
    <xsl:template match="Record">  
      <xsl:variable name="thisRecord" select="current()"/>  
      <xsl:for-each select="../../CONFIG/COL">  
        <xsl:value-of select="$thisRecord/child::*[name() = current()/@elem]"/><xsl:text>&#x9;</xsl:text>  
        <xsl:if test="position() = last()"><xsl:text>&#xA;</xsl:text></xsl:if>  
      </xsl:for-each>  
    </xsl:template>
    

    Ergebnis:

    Head2   Head 4
    1.0     col4-1
    2.0     col4-n

    Grüße,
    Thomas

  2. Hi Edmund!

    Ich denke, dass dich xsl:with-param besonders interessiert. Als ungestestete Skizze:

    <table>
    <xsl:for-each select="./CONFIG/COL">
      <tr><th><xsl:value-of select="./name" /></th>
      <xsl:call-template name="rowOut">
        <xsl:with-param name="criteria" select="./@elem" />
      </xsl:call-template>
      </tr>
    </xsl:for-each>
    </table>

    <xsl:template name="rowOut">
    <xsl:param name="criteria" />
    <xsl:for-each select="//Record/*"
      <xsl:if test="local-name(.)=$criteria">
        <td><xsl:value-of select="." /></td>
      </xsl:if>
    </xsl:for-each>
    </xsl:template>

    Das Problem ist nun, dass du die Ausgabe wie folgt erhältst:
    Head2  1.0    ... 2.0
    Head4  col4-1 ... col4-n

    Wenn das OK ist, dann bis du schon fertig, ansonsten kann ich sagen, dass es im Archiv einige Lösungsansätze für dieses row/col Problem gibt, auf die ich auch in eigenen Beiträgen verwiesen habe.

    Gruß,
    Richard