Lemmy Danger: XPath bei Verwendung von Namespaces

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

--
Man braucht nicht immer denselben Standpunkt zu vertreten, denn niemand kann einen daran hindern, klueger zu werden.
  1. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. 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

      --
      Es gibt drei Moeglichkeiten, eine Firma zu ruinieren: Mit Spielen, das ist am lustigsten. Mit Frauen, das ist am schoensten. Mit Computern, das ist am sichersten.
  2. 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

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

      --
      Ist der Weg zu Ende, veraendere dich. So veraendert, gehe weiter.
      1. 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

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

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

          --
          Meine Meinung steht fest - bitte verwirren Sie mich nicht mit Tatsachen!