XSL value-of... XML-Inhalt wiedergeben
Bastian
- xsl
Hallo,
ich lese aus der XML-Datei Felder aus z. B. <feld>Neuigkeiten</feld> und habe dazu die Regel, dass der Inhalt des Feldes immer der wesentliche Teil eines Hyperlinks ist.
<xsl:value-of select="feld"/> soll auf den folgenden Link führen:
http://domain.de/Link_Neuigkeiten.html
Wie schaffe ich es den value-of als Teil eines Links wiederzugeben?
<a href="http://domain.de/Link_<xsl:value-of select="feld">.html"/><xsl:value-of select="feld"/></a>
funktioniert ja nicht....
Der Vorteil soll sein, dass ich dann keine Hyperlinks in der XML-Datei speichern muss.
Moin,
<xsl:value-of select="feld"/> soll auf den folgenden Link führen:
http://domain.de/Link_Neuigkeiten.htmlWie schaffe ich es den value-of als Teil eines Links wiederzugeben?
<a href="http://domain.de/Link_<xsl:value-of select="feld">.html"/><xsl:value-of select="feld"/></a>
funktioniert ja nicht....
Ich denke, du musst hier für die Erzeugung des Elements und der Attribute mit xsl:element,
xsl:attribute und der XPath-Funktion concat arbeiten.
Gruß
Stareagle
Danke, hat geklappt!
<xsl:for-each select="felder/afge">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="normalize-space('http://domain.de/Link_')"/>
<xsl:value-of select="feld"/>
<xsl:value-of select="normalize-space('.html')"/>
</xsl:attribute>
<xsl:value-of select="feld"/>
</xsl:element>
</xsl:for-each>
Hallo Bastian,
<xsl:for-each select="felder/afge">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="normalize-space('http://domain.de/Link_')"/>
<xsl:value-of select="feld"/>
<xsl:value-of select="normalize-space('.html')"/>
</xsl:attribute>
<xsl:value-of select="feld"/>
</xsl:element>
</xsl:for-each>
Die Funktion normalize-space() ist vielleicht für den Inhalt des feld-Elements sinnvoll, aber was soll bei den beiden festen Zeichenketten außer eben diesen herauskommen (kein Whitespace vorhanden)?
xsl:element und xsl:attribute sind hier gar nicht nötig, es reicht:
<a href="http://domain.de/Link_{feld}.html"><xsl:value-of select="feld"/></a>
Grüße,
Thomas
Danke, das ist noch eine viel feinere Lösung.
'werd ich ausprobieren!
Danke, das ist noch eine viel feinere Lösung.
'werd ich ausprobieren!
Dies ist auch möglich:
<a>
<xsl:attribute name="href">hier_den_link_eingeben</xsl:attribute>
<xsl:value-of select="feld"/>
</a>
Mit xsl:attribute werden am besten auch Funktionen wie onClick, onMouseOver, onMouseOut, usw. gelöst. Merke: benutze ' anstelle von " innerhalb der xsl:attribute-tags, sofern notwendig.
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