2010-12-12 1 views
7

Ich wollte einen dynamischen Variablennamen in der Select-Anweisung in xslt verwenden.können wir dynamische Variablennamen in der Select-Anweisung in xslt verwenden?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:variable name="input" select="input/message" /> 
    <xsl:variable name="Name" select="'MyName'" /> 
    <xsl:variable name="Address" select="MyAddress" /> 
    <xsl:variable name="output" select="concat('$','$input')" /> <!-- This is not working --> 
    <output> 
     <xsl:value-of select="$output" /> 
    </output> 
</xsl:template> 

die möglichen Werte für die Variable "Eingang" ist 'Name' oder 'Adresse'. Die SELECT-Anweisung der Ausgabevariablen sollte einen dynamischen Variablennamen basierend auf dem Wert der Eingabevariablen haben. Ich möchte nicht xsl: select verwenden. Ich wollte den Wert dynamisch auswählen. Bitte stellen Sie mir eine Lösung zur Verfügung.

Danke, dhinu

+0

gute Frage, +1. Siehe meine Antwort für eine vollständige und kurze Lösung. :) –

Antwort

11

XSLT 1.0 und XSLT 2.0 haben keine dynamische Auswertung.

Lösung für Ihr Problem:

Diese Transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output method="text"/> 

<my:values> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</my:values> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "document('')/*/my:values/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 

, wenn sie auf der folgenden XML-Dokument angewendet:

<input> 
    <message>address</message> 
</input> 

erzeugt die korrektes Ergebnis wollte,:

MyAdress 

, wenn die gleiche Transformation auf diesem XML-Dokument angewandt wird:

<input> 
    <message>name</message> 
</input> 

wieder das gewünschte, korrekte Ergebnis wird produziert:

MyName 

Schließlich: Wenn Sie nicht die document() Funktion nutzen will, aber würde für die Verwendung der xxx:node-set() Erweiterungsfunktion, dann ist diese Lösung (Blick sehr ähnlich) ist das, was Sie wollen, wo Sie Ihre XSLTProcessor Dokumentation für den genauen Namensraum der Erweiterung konsultieren:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" > 
<xsl:output method="text"/> 

<xsl:variable name="vValues"> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "ext:node-set($vValues)/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

Danke! Es funktionierte für mich .. Will nur wissen, ob es einen alternativen Weg gibt, ohne den zusätzlichen Namespace xmlns: my = "my: my" zu benutzen? – dhinu

+0

@dhinu: Schön, dass meine Antwort nützlich war. Bei SO drückt sich die Dankbarkeit aus, indem man die Antwort akzeptiert (durch Klicken auf das Häkchen neben der Antwort) :). Sie können den '' in eine andere Datei setzen und mit der' document() 'Funktion wieder darauf zugreifen. In XSLT 1.0 müssen Sie diese Technik im Allgemeinen verwenden. Wenn sich Elemente im Rumpf einer '' oder einer '' befinden, können sie nicht direkt mit XPath aufgerufen werden, und eine Erweiterungsfunktion (' xxx: node-set() ') muss zuerst angewendet werden . In XSLT 2.0 kann direkt auf die Elemente innerhalb einer '' oder einer '' zugegriffen werden. –

+0

Können Sie ein Beispiel für den Zugriff auf die Elemente im Textkörper einer xsl: -Variable mithilfe der Erweiterungsfunktion (xxx: node-set()) angeben? (Ich benutze XSLT 1.0) – dhinu

0

Neben @ gute Antwort des Dimitre, für diesen speziellen Fall (Ausgabe-String-Wert) auch verwenden:

<xsl:variable name="output" 
       select="concat(substring($Name, 1 div ($input = 'Name')), 
          substring($Address, 1 div ($input = 'Address')))"/> 
Verwandte Themen