ThomasM: XSL value-of... XML-Inhalt wiedergeben

Beitrag lesen

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