2010-12-12 7 views
7

Chciałem użyć nazwy zmiennej dynamicznej w instrukcji select w xslt.czy możemy użyć nazwy zmiennej dynamicznej w instrukcji select w xslt?

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

możliwych wartości dla "wejście" zmienną jest 'Nazwa' lub 'Adres'. Instrukcja SELECT zmiennej wyjściowej powinna mieć nazwę zmiennej dynamicznej na podstawie wartości zmiennej wejściowej. Nie chcę używać xsl: wybierz. Chciałem dynamicznie wybrać wartość. Proszę podać mi rozwiązanie.

Dzięki, dhinu

+0

dobre pytanie, +1. Zobacz moją odpowiedź na kompletne i krótkie rozwiązanie. :) –

Odpowiedz

11

XSLT 1.0 i XSLT 2.0 nie mają dynamiczną ocenę.

rozwiązanie problemu:

Ta przemiana:

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

po naniesieniu na poniższym dokumencie XML:

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

produkuje chciał, poprawny wynik:

MyAdress 

gdy ta sama transformacja jest stosowane w niniejszym dokumencie XML:

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

ponownie poszukiwany, poprawny wynik jest produkowany:

MyName 

Wreszcie: Jeśli nie chcesz używać funkcji document(), ale skorzystasz z funkcji rozszerzenia xxx:node-set(), wtedy to rozwiązanie (wyglądające bardzo podobnie) jest tym, czego potrzebujesz, gdzie możesz zapoznać się z dokumentacją XSLTprocessor dla dokładnego obszaru nazw rozszerzenia:

<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

Dziękujemy! To zadziałało dla mnie ... Po prostu chcesz wiedzieć, czy istnieje inny sposób, bez używania dodatkowej przestrzeni nazw xmlns: my = "my: my"? – dhinu

+0

@dhinu: Cieszę się, że moja odpowiedź była przydatna. Na SO wdzięczność wyraża się akceptując odpowiedź (klikając na znacznik obok odpowiedzi) :). Możesz umieścić '' w innym pliku i ponownie uzyskać do niego dostęp za pomocą funkcji 'document()'. W XSLT 1.0 zazwyczaj musisz używać tej techniki. Jeśli elementy znajdują się w treści '' lub '', nie można uzyskać do nich dostępu za pomocą XPath bezpośrednio, a funkcja rozszerzenia ('xxx: node-set()') jest niezbędna do zastosowania jako pierwsza . W XSLT 2.0 dostęp do elementów wewnątrz '' lub '' jest możliwy bezpośrednio. –

+0

Czy możesz podać przykład dostępu do elementów w treści zmiennej xsl: za pomocą funkcji rozszerzenia (xxx: node-set())? (Im przy użyciu XSLT 1.0) – dhinu

0

Obok @ dobra odpowiedź Dimitre, w tym konkretnym przypadku (wartość ciąg wyjściowy) można również użyć:

<xsl:variable name="output" 
       select="concat(substring($Name, 1 div ($input = 'Name')), 
          substring($Address, 1 div ($input = 'Address')))"/> 
Powiązane problemy