Variablen in XPath
Martin
- xml
0 sschumann0 Martin
0 Thomas J.S.0 Martin0 sschumann0 Thomas J.S.0 Martin
Halli hallo.
Ich habe ein kleines Problem.
Ich wollte gerne wissen - da ich den ganzen Tag schon auf der Suche nach einer Lösung bin - ob ich in die XPath Syntax auch Variablen integrieren kann.
Ich hab zB in der XML Datei Einträge mit Querverweisen auf andere Elemente der XML Datei.
<linkto>/1/1/1/1/1/1/</linkto>
Nun lese ich diesen Text aus und speicher ihn in einer Variable.
Da ich nun aber aus dem Element /1/1/1/1/1/1/ noch Werte brauche, wollte ich mittels
<xsl:param name="y" select="$var_mit_dem_pfad/y" auf das element y zugreifen. Leider funktioniert das nicht.
Kennt jemand eine Lösung, bzw .. ist es überhaupt möglich?
Viele Dank,
Martin
<xsl:param name="y" select="$var_mit_dem_pfad/y" auf das element y zugreifen. Leider funktioniert das nicht.
Um den String zusammenzufrickeln, müßte erst ein concat() her. Der Rest ist abhänging vom verwendeten Prozessor. Zum Beispiel bietet Saxon das saxon:evaluate(). Steht i.d.R. in der Doku des Parsers.
Konkret hieße das hier:
<xsl:param name="y" select="saxon:evaluate(concat($var_mit_dem_pfad,'y'))" />
Um den String zusammenzufrickeln, müßte erst ein concat() her. Der Rest ist abhänging vom verwendeten Prozessor. Zum Beispiel bietet Saxon das saxon:evaluate(). Steht i.d.R. in der Doku des Parsers.
Stimmt an concat hab ich bis hier noch gar nicht gedacht.
Werde es gleich mal ausprobieren
Konkret hieße das hier:
<xsl:param name="y" select="saxon:evaluate(concat($var_mit_dem_pfad,'y'))" />
Noch besser :) brauche ich ja gar nicht mehr selber denken.
Vielen Dank erstmal.
Martin
Hallo,
--------------- zitat --------------
<xsl:param name="y" select="saxon:evaluate(concat($var_mit_dem_pfad,'y'))" />
Noch besser :) brauche ich ja gar nicht mehr selber denken.
--------------- /zitat --------------
Sofern du _immmer_ Saxon als XSLT-Prozessor verwendest ist dies eine Lösung. Wenn nicht stehst du leider im Regen damit.
Ich wollte gerne wissen - da ich den ganzen Tag schon auf der Suche nach einer Lösung bin - ob ich in die XPath Syntax auch Variablen integrieren kann.
Generelle ja: aber es kommt darauf wan was der Wert der Variable dann ist.
Ich hab zB in der XML Datei Einträge mit Querverweisen auf andere Elemente der XML Datei. <linkto>/1/1/1/1/1/1/</linkto>
In diesem Fall <xsl:variable name="var_mit_dem_pfad" select="linkto" /> wäre der Wert der Variable ein String.
Da ich nun aber aus dem Element /1/1/1/1/1/1/ noch Werte brauche, wollte ich mittels
<xsl:param name="y" select="$var_mit_dem_pfad/y" auf das element y zugreifen. Leider funktioniert das nicht.
Dies würde auch mit concat() nicht funktionieren, eben weil der Wert deiner Variable ein String ist.
Wenn deine Variable so aussehen würde:
<xsl:variable name="var_mit_dem_pfad" select="/1/1/1/1/1/1" />
könntest du auf das Y-Element auch so zugreifen:
<xsl:value-of select="$var_mit_dem_pfad/Y" />. weil in diesem Fall der Wert der Variable ein Teilbaum ist.
Grüße
Thomas
Danke für die vielen Tipps.
Denn momentan weiss ich nicht welcher XSL Parser am Ende genutzt wird.
Und wenn halt kein Saxon genutzt wird, dann ständ ich blöd da so ohne funktionierendes Beispiel :)
Allerdings wird es mit deiner Lösung nicht funktionieren, da ich vorher noch nicht weiss wie der Pfad (hier /1/1/1/1/1/) im Endeffekt auszusehen hat. Er ist halt "dynamisch" und deswegen kann ich nicht einfach im XSL File <xsl:variable name="var_mit_dem_pfad" select="/1/1/1/1/1/" /> machen... das muss schon irgendwie dynamisch gemanagt werden...
Denn momentan weiss ich nicht welcher XSL Parser am Ende genutzt wird.
Und wenn halt kein Saxon genutzt wird, dann ständ ich blöd da so ohne funktionierendes Beispiel :)
Man sollte eigentlich immer mit dem Parser entwickeln, der auch eingesetzt wird. Stichwort Performance und so...
Allerdings wird es mit deiner Lösung nicht funktionieren, da ich vorher noch nicht weiss wie der Pfad (hier /1/1/1/1/1/) im Endeffekt auszusehen hat. Er ist halt "dynamisch" und deswegen kann ich nicht einfach im XSL File <xsl:variable name="var_mit_dem_pfad" select="/1/1/1/1/1/" /> machen... das muss schon irgendwie dynamisch gemanagt werden...
Dann hol Dir den Variablen-Wert aus einem Template-Call.
Hallo,
Man sollte eigentlich immer mit dem Parser entwickeln, der auch eingesetzt wird. Stichwort Performance und so...
Jein.
Erst sollte man nach dem Standard entwickeln, dann wenn die Möglichkeiten dabei ausgeschöft sind kann man sich überlegen auf parsereigene Funktionen zugreifen. Aber es muss einem wirklich bewusst sein, dass man sich damit auf eine Software festzementiert.
Er ist halt "dynamisch" und deswegen kann ich nicht einfach im XSL File <xsl:variable name="var_mit_dem_pfad" select="/1/1/1/1/1/" /> machen... das muss schon irgendwie dynamisch gemanagt werden...
Dann hol Dir den Variablen-Wert aus einem Template-Call.
Er braucht unbedingt ein Teilbaum als Wert der Variable.
Umständlich kann er das mit Vergleichen machen: name() im Variablenwert enthalten etc.
(Du hast natürlich recht, dass z.B. die eval-Funktion vom Saxon da sehr gut ist (andere Parser bieten auch ähnliches))
Grüße
Thomas
Jein.
Erst sollte man nach dem Standard entwickeln, dann wenn die Möglichkeiten dabei ausgeschöft sind kann man sich überlegen auf parsereigene Funktionen zugreifen. Aber es muss einem wirklich bewusst sein, dass man sich damit auf eine Software festzementiert.
Deswegen code ich ja auch parser-unabhängig.
Naja ist im Endeffekt nicht weiter schlimm.
Mich hat das nur interessiert.
Werd es wohl ohne diese Methode lösen (da alles ander zu umständlich wäre und den Parser nur ausbremsen würde).
Also sollen die Daten schon so in der XML Datei sein, dass ich nicht noch erst im XSLT mittels XPath navigieren muss ;)