Christian Seiler: Komme mit Namspace net klar - HELP!

Beitrag lesen

Hallo Andreas,

Das ganz wird nicht angezeigt. Soweit ich das Thema bisher überblicken kann, kann ich "//Einstellung" nicht verwenden - wegen diesem Namespace-Zeugs im "parent".
Denn, wenn ich die XML modifiziere und die Zeile

<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://abc.com/abc/Data" Fach1ID="d0aea575-3dca-403a-b14c-33df3b515e07" Fach2ID="4bb6e2a0-0574-4324-a935-0b4ccd95831a" Fach3ID="2ebc264a-df30-4fa1-836a-e352cb2eb82b" Fach4ID="2df3806b-f173-4e43-929b-7945a7dc7aea">

abändere in

<Data>

dann wird alles genau so angezeigt, wie ich das haben will. Kann mir einer helfen, wie ich das anspechen muss?

Dein Problem ist folgendes:

<Data xmlns="http://abc.com/abc/Data">

legt fest, dass der Default-Namespace für alle Elemente "http://abc.com/abc/Data" ist (NICHT jedoch für alle Attribute, das ist das IMHO ziemlich verwirrende an der XML-Namespace-Spec). XSLT verwendet nun XPath, um auf Elemente zuzugreifen. Bei XPath musst Du dann aber explizit den Namespace angeben, damit er das ganze erkennt.

Du hast zwei Möglichkeiten:

  1. Du wählst explizit den Namespace aus, d.h. Du definierst ihn Dir per

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:data="http://abc.com/abc/Data">

Dann kannst Du das Präfix "data" in XPath-Ausdrücken verwenden z.B. so:

<xsl:for-each select="//data:Einstellung">

Genauso musst Du natürlich auch alle anderen Elemente ansprechen:

        <td><xsl:value-of select="data:Datum"/></td>  
        <td><xsl:value-of select="data:Zahl"/></td>

Wenn Du kein Präfix definieren willst, kannst Du (umständlicher) auch über Qualifikatoren arbeiten, d.h.

<xsl:for-each select="//*[local-name() = 'Einstellung']">

sowie

        <td><xsl:value-of select="*[local-name() = 'Datum']"/></td>  
        <td><xsl:value-of select="*[local-name() = 'Zahl']"/></td>

(In dem Fall wäre sogar der Namespace komplett egal, ich würde diese Lösung dennoch nicht empfehlen)

Zudem kannst Du je nach XSLT-Prozessor meist noch die Syntax select="//{http://abc.com/abc/Data}Einstellung" nutzen, wenn Du den Namespacenamen direkt angeben willst.

Beachte bitte, dass das nur für Elementnamen gibt, bei Attributnamen (z.B. @data:Fach1-ID) wird das nicht funktionieren, da musst Du weiterhin nur den Namen schreiben (@Fach1-ID) - AUSSER vor dem Attribut steht explizit schon in der XML-Datei ein Namespace-Präfix, dann musst Du mit dem gleichen Namespace matchen (was in Deiner XML-Datei nicht zwangsläufig das gleiche Präfix sein muss!).

Viele Grüße,
Christian