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

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.

  1. Moin,

    <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....

    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

    1. 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>

      1. 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

        1. Danke, das ist noch eine viel feinere Lösung.
          'werd ich ausprobieren!

          1. 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.

            1. 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