Thomas J.S.: Schleife ohne for-each

Beitrag lesen

Hallo,

Es wird immer der erste node angezeigt!

Ersten du rufst hier ein Template auf, für den du aber gar keine Parameter definiert hast, also wird dein with-param nichts bewirken.

<xsl:apply-templates select="control">
   <xsl:with-param name="btnName" select="new"/>
  </xsl:apply-templates>

<xsl:template name="BUTTON" match="BUTTON">
  <xsl:param name="btnName">
   <xsl:value-of select="//BUTTON/@name"/>
  </xsl:param>

Der Paramter hier an dieser Stelle selektiert genau des erste BUTTON-Element aud dem Dokument. Außerdem du willst ja den Parameter später bekannt geben.

<xsl:text disable-output-escaping="yes"><img src="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@src"/>
<xsl:text disable-output-escaping="yes">" href="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@href"/>
<xsl:text disable-output-escaping="yes">" alt="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@alt"/>
<xsl:text disable-output-escaping="yes">" border="0"/></xsl:text>

Das ist mächtig viel Lärm um nichts und es macht dir das Leben zur Hölle wenn du mit solchen Kontrukten arbeiten willst.
Du _kannst_ Elemente normal in einem XSL-Sheet schreiben: diese sind dann die 'literal result elements' und werden in das Ergebnisdokument hineingeschreiben.

<xsl:value-of select="//BUTTON[@name=$btnName]/@src"/>
xsl:value-of enthält als Wert _immer_ nur den ersten Knoten auf dem der XPath-Ausdruck im select="" passt. (auch wenn es mehrere solche Knoten gäbe)

was mach ich falsch??

Alles was nur geht. ;-)

So könnte dein Template aussehen (wobei du beachten solltest, dass ein <img> in HTML kein Attribut href haben darf!):

<xsl:template match="control/BUTTON">
  <xsl:param name="btnName" />
  <xsl:if test="$btnName = name">
 <img src="{@src}" href="{@href}" alt="{@alt}" border="0" />
  </xsl:if>
 </xsl:template>

und so könntest du es aufrufen:

<tr><td>
  <xsl:apply-templates select="control/BUTTON">
   <xsl:with-param name="btnName" select="new"/>
  </xsl:apply-templates>
 </td></tr>

Die _eigentliche_  Frage ist, was möchtest du erreichen?
Ich nehme an du möchtest die BUTTON-Elemente gruppiert nach dem @name-Attribut ausgeben. Wenn ja, solltest du dich mit key() und xsl:key beschäftigen. Im Archiv findest du jede Menge Lösungen dazu.

Grüße
Thomas