XPath bei Verwendung von Namespaces
Lemmy Danger
- xsl
Hallo!
Ich möchte gerne eine XML-Datei mittels XSLT transformieren. Die XML-Datei schaut sinngemäß wiefolgt aus:
<?xml version="1.0">
<ts:root
xmlns:ts="http://www.example.com/ts"
xmlns="http://www.example.com/def">
<foo>bar<foo/>
</root>
Mein Problem ist nun, dass ich keine Ahnung habe, wie ich wegen des Namespaces das Wurzelelement oder eines seiner Kindelemente ansprechen soll. Eigentlich dachte ich, man könne im XSL-Stylesheet einfach folgendes schreiben (den Namensraum habe ich natürlich auch im Stylesheet definiert):
<xsl:value-of select="/ts:root/foo"/>
Leider denkt mein XSLT-Prozessor (Sablotron) da anders. Es kommt zwar keine Fehlermeldung, aber den richtigen Knoteninhalt gibt er trotzdem nicht aus.
Kann mir bitte jemand auf die Sprünge helfen?
Vielen Dank,
Oliver
Hi,
<?xml version="1.0">
<ts:root
xmlns:ts="http://www.example.com/ts"
xmlns="http://www.example.com/def">
<foo>bar<foo/>
</root>
Liegt das Problem vielleicht daran, daß das kein korrektes XML ist? Du schließt ein Element root, das nirgends geöffnet wurde.
Dafür wird aber das Element ts:root nirgends geschlossen.
cu,
Andreas
Hallo MudGuard,
Dafür wird aber das Element ts:root nirgends geschlossen.
nee, sorry, das war ein Vertipper. Natürlich schließt das Dokument mit </ts:root>, nicht mit </root>.
Aber die Syntax des value-of-Statements sollte doch eigentlich stimmen, oder?
Oliver
Hallo,
<xsl:value-of select="/ts:root/foo"/>
Leider denkt mein XSLT-Prozessor (Sablotron) da anders. Es kommt zwar keine Fehlermeldung, aber den richtigen Knoteninhalt gibt er trotzdem nicht aus.
Probiere es so:
<xsl:value-of select="/ts:root/child::*[name()='foo']"/>
bzw.
<xsl:value-of select="/ts:root/child::*[name()='foo'][1]"/>
MfG, Thomas
Hallo!
<xsl:value-of select="/ts:root/child::*[name()='foo']"/>
Vielen Dank, das funktioniert!
Kannst Du mir vielleicht erklären, warum man das so umständlich machen muss? Ich rufe z.B. auch ein apply-templates mit dem Knoten <foo> auf; dort muss ich ebenfalls mit der Achse und der Wildcard selektieren, genauso wie im match-Attribut des Templates...
Funktioniert die 'normale' Selektion (/.../...) nur dann, wenn die Elemente den gleichen Namespace haben?
Viele Grüße,
Oliver
Hallo,
Kannst Du mir vielleicht erklären, warum man das so umständlich machen muss?
name() liefert den "qualified name" mit dem zugehoerigen Namespace.
"/ts:root/*[name()='foo']" und "/ts:root/*[name()='foo'][1]" sind Kurzformen der genannten XPath-Ausdruecke.
<xsl:value-of select="namespace-uri(/ts:root/*[name()='foo'])"/> liefert den Namespace-URI des foo-Elements (hier also "http://www.example.com/defbar").
MfG, Thomas
Hallo "Wie heisst du nochmal?"
Kannst Du mir vielleicht erklären, warum man das so umständlich machen muss?
http://archive.gingerall.cz/archives/public/sablot2001/msg01740.html
Grüße
Thomas
Hallo!
Hallo "Wie heisst du nochmal?"
Nach einem halben Jahr Forumsabstinenz wollte ich eigentlich wieder mein altes Pseudonym verwenden. Das kommt halt davon, wenn man die Änderungen nicht gleich in den User-Einstellungen vornimmt...
http://archive.gingerall.cz/archives/public/sablot2001/msg01740.html
Danke für den Link!
Viele Grüße,
Oliver