Constantin: XPATH in XSL-Schleife iterieren und auswerten

Hallo,

ich bin auf der Suche nach einer Möglichkeit, in einer Schleife gezielt mit XPATH auf einzelne Elemente zuzugreifen und die Positionsangabe in XPATH in der Schleife zu iterieren. Das ganze brauche ich, weil ich Daten aus einer Tabelle in eine andere Form transformieren muss.

Beispiel:
XML:
<tabelle>
 <spalte1>name_xxx</spalte1>
 <spalte>name_1</spalte>
 <spalte>name_2</spalte>
 <spalte>name_3</spalte>
 <zelle_spalte1>xx1</zelle_spalte1>
 <zelle>wert_1</zelle>
 <zelle>wert_2</zelle>
 <zelle>wert_3</zelle>
</tabelle>

XSLT:
<xsl:template match="/tabelle">
 <Tabelle>
  <xsl:call-template name="zelle_spalte1"/>
 </Tabelle>
</xsl:template>

<xsl:template name="zelle_spalte1">
 <xsl:call-template name="zelle">
  <xsl:with-param name="zähler_spalte">1</xsl:with-param>
  <xsl:with-param name="zähler_zelle">1</xsl:with-param>
  <xsl:with-param name="anzahl">4</xsl:with-param>
 </xsl:call-template>
</xsl:template>

<xsl:template name="zelle">
 <xsl:param name="zähler_spalte">0</xsl:param>
 <xsl:param name="zähler_zelle">0</xsl:param>
 <xsl:param name="anzahl">0</xsl:param>

<xsl:if test="$zähler_spalte &lt;= $anzahl">
  <SPALTE>
   <xsl:for-each select="zelle_spalte1">
   <WERTE>
    <NAME>
     <xsl:value-of select="parent::node()/spalte[$zähler_spalte]"/>
    </NAME>
    <BEZEICHNUNG>
     <xsl:value-of select="."/>
    </BEZEICHNUNG>
    <WERT>
     <xsl:value-of select="following-sibling::node()"/>
    </WERT>
   </WERTE>
   </xsl:for-each>
  </SPALTE>
  <xsl:call-template name="zelle">
   <xsl:with-param name="zähler_spalte"><xsl:value-of select="$zähler_spalte + 1"/></xsl:with-param>
   <xsl:with-param name="zähler_zelle"><xsl:value-of select="$zähler_zelle + 1"/></xsl:with-param>
   <xsl:with-param name="anzahl"><xsl:value-of select="$anzahl"/></xsl:with-param>
  </xsl:call-template>
 </xsl:if>
</xsl:template>

OutputXML:
<Tabelle xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <SPALTE>
  <WERTE>
   <NAME>name_1 name_2 name_3</NAME>
   <BEZEICHNUNG>xx1</BEZEICHNUNG>
   <WERT>wert_1 wert_2 wert_3</WERT>
  </WERTE>
 </SPALTE>
 <SPALTE>
  <WERTE>
   <NAME>name_1 name_2 name_3</NAME>
   <BEZEICHNUNG>xx1</BEZEICHNUNG>
   <WERT>wert_1 wert_2 wert_3</WERT>
  </WERTE>
 </SPALTE>
 <SPALTE>
  <WERTE>
   <NAME>name_1 name_2 name_3</NAME>
   <BEZEICHNUNG>xx1</BEZEICHNUNG>
   <WERT>wert_1 wert_2 wert_3</WERT>
  </WERTE>
 </SPALTE>
 <SPALTE>
  <WERTE>
   <NAME>name_1 name_2 name_3</NAME>
   <BEZEICHNUNG>xx1</BEZEICHNUNG>
   <WERT>wert_1 wert_2 wert_3</WERT>
  </WERTE>
 </SPALTE>
</Tabelle>

Aber natürlich will ich nicht als Ergebnis "name_1 name_2 name_3" für Name haben, sondern einen der drei. Folgender (intuitiver) Versuch hat leider nicht den gewünschten Erfolg gebracht, auch wenn er genau das zeigt, was ich bräuchte: Eine Möglichkeit, einen XPATH mit einem Zähler zu kombinieren und den XPATH direkt auszuwerten.

<xsl:value-of select="parent::node()/spalte[$zähler_spalte]"/>

Hat jemand eine Idee? Vielen Dank für Eure Antworten!

Gruß Constantin

  1. Problem gelöst!

    Für alle, die an der Lösung interessiert sind:

    (...)
      <xsl:value-of select="parent::node()/spalte[position() = $zähler_spalte]"/>
    (...)

    Anscheinend kann XPATH in der Kurzschreibweise keine XSLT-Parameter auswerten. Mit position() umgeht man dieses Problem.