XPath aus xml:param zusammensetzen
Mirco
- xsl
0 Thomas J.S.0 Mirco0 Thomas J.S.0 Mirco
Hi.
Ich möchte in meinem XSL einen bestimmten Wert aus der XML-Datei verwenden.
Die XML-Datei wird komplett dynamisch erzeugt. Im Anschluß daran wird die <stringtable> noch reinkopiert:
<root x="entry2">
...
<stringtable>
<entry1>
<e id="1">...</e>
<e id="2">...</e>
</entry1>
<entry2>
<e id="1">...</e>
<e id="2">...</e>
</entry2>
<entry3>
<e id="1">...</e>
<e id="2">...</e>
</entry3>
</stringtable>
</root>
In der XSL-Datei möchte ich nun folgendes machen.
<xsl:param name="x" select="root/@x"/>
<xsl:param name="pfad" select="root/stringtable/$x"/>
um dann mittels
<xsl:value-of select="$pfad/e[@id=2]" />
den wert aus "root/stringtable/entry2/e" zu lesen, bei dem "id=2" ist.
d.h., wie genau die select-Anweisung heißen muss, entscheidet sich erst, nachdem das XML-File erzeugt wurde - also immer erst unmittelbar vorm aufruf des XSLT-Prozessors.
Allerdings beschleicht mich das Gefühl, dass Konstrukte wie 'select="root/stringtable/$x"' nicht funktionieren. Hat einer von euch einen Hinweis, wie man so ein select erstellt?
Gruß,
Mirco
P.S.: Ja, das ist dazu gedacht, um unterschiedliche Sprachen zu unterstützen (deshalb auch Stringtable). Vermutlich gibt es dafür viel bessere Konzepte?!? Stuck my nose into it if you like...
Hallo,
<root x="entry2">
In der XSL-Datei möchte ich nun folgendes machen.
<xsl:param name="x" select="root/@x"/>
Das liefert dann einen String.
<xsl:param name="pfad" select="root/stringtable/$x"/>
Der gelieferter Sting bleibt String und nicht ein Knoten.
<xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>
um dann mittels
<xsl:value-of select="$pfad/e[@id=2]" />
Das wäre dann möglich.
Allerdings beschleicht mich das Gefühl, dass Konstrukte wie 'select="root/stringtable/$x"' nicht funktionieren.
Wenn man bestimmte Sachen beachtet, funktioniert sowas schon.
Grüße
Thomas
<xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>
Ja, super! Genau so funktioniert es. Dankeschön.
(Ich muss aber gestehen, dass ich den * da nicht hingesetzt hätte. Hmm, über den Grund muss ich wohl noch mal nachdenken...)
Viele Grüße,
Mirco
Hallo,
<xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>
Ja, super! Genau so funktioniert es. Dankeschön.
(Ich muss aber gestehen, dass ich den * da nicht hingesetzt hätte. Hmm, über den Grund muss ich wohl noch mal nachdenken...)
Der * bezeichent in diesem Ausdruck ein beliebiges Kindelement vom <stringtable>, d.h. es werden alle Kindelemente ausgewählt. Im Predikat ([]) wird aber gesagt, dass ein Kindelement nur dann ausgewählt werden soll, wenn dessen Name = $x ist.
Grüße
Thomas
Hi,
Der * bezeichent in diesem Ausdruck ein beliebiges Kindelement vom <stringtable>, d.h. es werden alle Kindelemente ausgewählt. Im Predikat ([]) wird aber gesagt, dass ein Kindelement nur dann ausgewählt werden soll, wenn dessen Name = $x ist.
Ach so, ich dachte, dass die Suche bei der Angabe von Prädikaten implizit über alle Kindelemente iteriert. Deshalb habe ich mich über den * gewundert. Vielen Dank für deine Zeit (und dein knowhow).
Gruß,
Mirco