2009-04-02 12 views
17

Kann mir bitte jemand sagen, wie man eine Variable in meiner XSL-Transformation ausgibt? Es scheint so einfach zu sein, aber ich kann es einfach nicht tun. Hier ist der Code, den ich habe:Den Wert einer XSL-Variable ausgeben

<?xml version='1.0' encoding='UTF-8' ?> 
<xsl:stylesheet version="1.0" 
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template name="ControlledListStructure"> 
    <xsl:param name="xmlElem" /> 
    <xsl:param name="dataName" /> 

    <xsl:element name="{$xmlElem}"> 
     1: <xsl:text>{$xmlElem}</xsl:text>. 
     2: {$xmlElem}. 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Wenn ich diese Vorlage mit einem Wert für xmlElem von "Wibble" genannt (a string - kein Knoten), würde ich folgende Ausgabe:

<Wibble> 
     1: {$xmlElem}. 
     2: {$xmlElem}. 
</Wibble> 

Also kommt mein Parameter richtig rüber, ich kann einfach nicht richtig darauf zugreifen. Kann mir jemand sagen, wie ich $ xmlElem bekommen kann richtig zu drucken, so dass ich sehe:

<Wibble> 
     1: Wibble. 
     2: Wibble. 
</Wibble> 

Vielen Dank für jede Eingabe.

+1

Ich habe einige Lücken durch die vorherigen Antworten gefüllt. Gute Frage! –

+1

Bitte denken Sie daran, Dimitres Antwort als "Akzeptiert" zu markieren, da seine Antwort sehr informativ ist und das "Warum" nicht nur das "Wie" erklärt. Vielen Dank! –

Antwort

31

Alle Antworten fehlen etwas Wichtiges: lesen weiter:

Kann mir bitte jemand sagen, wie man Ausdruck eine Variable in meinem XSL verwandeln? Scheint wie ein einfach genug Ding zu tun, aber ich kann einfach nicht scheinen es tun.

In XSLT 1.0 gibt es zwei Möglichkeiten, den Inhalt eines <xsl:variable> Herstellung in Abhängigkeit davon, ob es einen skalaren Wert (string, Zahl oder boolean) enthält, oder eine strukturierte Wert hat - ein node- Set (ein oder mehrere Knoten aus XML-Dokument (e)):

  1. <xsl:value-of select="$yourscalarVariableName"/> verwenden einen skalaren Wert zu erzeugen. Erstellt tatsächlich einen Textknoten, der diesen Skalarwert enthält.

  2. <xsl:copy-of select="$yourStructuredVariableName"/> Verwenden Sie dies, um eine Kopie aller in der Variablen enthaltenen Knoten zu erstellen.

Es ist sehr wichtig zu wissen, dass, wenn ein xsl:variable eine Liste von Knoten enthält und die <xsl:value-of ...> Anweisung verwendet wird, wird nur der String-Wert des ersten Knotens produziert. Dies ist ein häufig begangener Fehler und eine FAQ.

Es gibt einen dritten Weg: Wenn die <xsl:variable> sollte bei der Herstellung ein Attribut verwendet werden:

<someLiteralResultElement someAttribute="{$theVariable}"/> 

Der XPath-Ausdruck in den geschweiften Klammern (genannt AVT -- attribute-value-template) ausgewertet und das Ergebnis in die setzen Attributwert.

in XSLT 2.0 die <xsl:value-of .../> Anweisung, wenn sie nicht im Kompatibilitätsmodus ausführen, erzeugt eine Liste von Textknoten - eines für jeden Knoten in der xsl:variable enthalten. Bei Ausführung im Kompatibilitätsmodus (hat das Attribut version="1.0" angegeben) verhält sich der <xsl:value-of>-Befehl genauso wie in XSLT 1.0.

In Xslt 2.0<xsl:copy-of> verhält sich auf die gleiche Weise wie in XSLT 1.0. Es wird jedoch empfohlen, die neue Anweisung <xsl:sequence> zu verwenden, da die erstere eine neue Kopie jedes Knotens erzeugt, während <xsl:sequence> keine neuen Kopien von Knoten erzeugt.

+0

+1 Sehr informativ und gut gemacht! –

+0

@ Andrew-Hare Danke, ich schätze deine Meinung sehr! –

10

Try this:

<xsl:value-of select="$xmlElem"/> 
+0

Sie denken, dass ich das versucht hätte! Vielen Dank. –

+0

Manchmal ist die einfachste Lösung die schwer fassbarste! Froh, dass ich helfen könnte :) –

4

Sie verwenden können:

<xsl:value-of select="$xmlElem" /> 
3

Die {$ xmlElem} Syntax funktioniert nur innerhalb eines Attributs. Sie benötigen:

<xsl:value-of select="$xslElem" /> 
Verwandte Themen