Hallo Chris,
die häufige Verwendung von xsl:attribute (und auch von xsl:element) ist eher schlechter Stil oder wird irgendwoher übernommen.
Beide Elemente sind erst dann wirklich nötig, wenn sich Namen oder Inhalte aus weiteren Operationen ergeben.
Beispiel zu xsl:attribute auf der Basis von Punktkoordinaten, welche in eine SVG-Polyline transformiert werden sollen:
<?xml version="1.0" encoding="ISO-8859-1"?>
<daten info="SVG-Darstellung von XML-Daten">
<punkt><x>55</x><y>205</y></punkt>
<punkt><x>67</x><y>176</y></punkt>
<punkt><x>86</x><y>160</y></punkt>
<punkt><x>109</x><y>152</y></punkt>
<punkt><x>135</x><y>150</y></punkt>
<punkt><x>162</x><y>150</y></punkt>
<punkt><x>188</x><y>148</y></punkt>
<punkt><x>212</x><y>141</y></punkt>
<punkt><x>231</x><y>126</y></punkt>
<punkt><x>244</x><y>99</y></punkt>
</daten>
XSLT-Fragment:
<xsl:template match="daten">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<polyline stroke="#00C" stroke-width="1" fill="none">
<xsl:attribute name="points">
<xsl:for-each select="punkt">
<xsl:value-of select="x"/><xsl:text>,</xsl:text>
<xsl:value-of select="y"/>
<xsl:if test="position() != last()"><xsl:text> </xsl:text></xsl:if>
</xsl:for-each>
</xsl:attribute>
</polyline>
</svg>
</xsl:template>
Polyline-Ergebnis:
<polyline stroke="#00C" stroke-width="1" fill="none"
points="55,205 67,176 86,160 109,152 135,150 162,150 188,148 212,141 231,126 244,99"/>
Unter XSLT/XPath 2.0 wird xsl:attribute noch seltener nötig, im Beispiele reduziert sich der Aufwand im Wesentlichen auf:
<polyline stroke="#00C" stroke-width="1" fill="none" points="{for $p in punkt return fn:concat($p/x,',',$p/y)}"/>
Saxon 9.0 erzeugt wiederum:
<polyline stroke="#00C" stroke-width="1" fill="none"
points="55,205 67,176 86,160 109,152 135,150 162,150 188,148 212,141 231,126 244,99"/>
Also bitte den Attribute Value Templates {...} so oft wie möglich den Vorzug geben bzw. Elemente literal auszeichnen!
Grüße,
Thomas