Announcement

Collapse
No announcement yet.

Problem: XML, XML Transformation, Namespace

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem: XML, XML Transformation, Namespace

    Ich hab mal wieder so ein Problem mit den Namespaces, dass ich mir absolut nicht erklären kann:

    Quell XML-Datei:
    --------------------------------------------
    Code:
    <course>
    <treenodes>
       <treenode id="1" name="lala">  
       </treenode>
    <treenodes>
    </course>
    Hinweis zum Schema: Ein <treenode> kann beliebig viel <treenode> enthalten.

    Stylesheet
    -------------------------------------------
    Code:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xsi">
    
    <xsl:template match="course">
       <item xmlns="http://xyz"   
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xyz zyz.xsd"  
         identifier="{@id}" title="{@name}">
             <xsl:apply-templates select="treenodes/treenode"/>	
       </item>
    </xsl:template>
    
    <xsl:template match="treenode">
    		<xsl:choose>
    			<xsl:when test="not(child::*)">
    				<Section  title="{@text}"  identifier="{@id}" >
    					<xsl:apply-templates select="document(...)/..." />
    				</Section>
    			</xsl:when>
    			<xsl:otherwise>
    				<Section title="{@text}"  identifier="{@id}" >
    					<xsl:apply-templates select="treenode"/>
    				</Section>
    			</xsl:otherwise>
    		</xsl:choose>
    </xsl:template>
    Ziel-Datei
    ----------------------------------------------
    Code:
    <item xmlns="http://xyz"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://xyz xyz.xsd" >
    		<Section  xmlns="" title="lala" identifier="4534">
    			<Section  title="jkhl" identifier="88">
    				<Section  title="hkhkl" identifier="88">
    					...
    Das Problem ist jetzt, dass in der ersten <Sektion> von oben immer das xmlns="" auftaucht, dass ich an dieser Stelle aber nicht haben will. Kann mir jemand vielleicht erklären warum?

    Vielen Dank für Tipps und Hinweise

  • #2
    Gib den Default-NS beim xsl:stylesheet-Element an:

    Code:
    <xsl:stylesheet version="1.0" xmlns="http://xyz" xmlns:xsl="..." ...>
    ...
    </xsl:stylesheet>

    Comment


    • #3
      Vielen Dank. Dein Vorschlag funktioniert.

      Was mir allerdings noch ein Rätsel ist: Das xmlns="" wird wirklich nur in der ersten <Section> von oben eingefügt. Alle anderen Sections bleiben davon verschont, obwohl das "treenode" template rekursiv alle <treenode> Elemente durchläuft und dabei die <treenode> Elemente, die weitere treenodes als children haben gleich behandelt?

      Comment


      • #4
        Das liegt an der separaten Verarbeitung der Templates, die dem funktionalen Character von XSLT nach nichts voneinander wissen, also nur aufgerufen werden (ggf. unter Übergabe von Parametern).

        Das erste Template greift auf course zu und schreibt den angegebenen NS in den Ausgabebaum. Das treenode-Template schreibt rekursiv Section-Elemente in den Ausgabebaum und stellt beim ersten Element fest, dass zwar mit Namensräumen operiert wird, aber in diesem Kontext keiner bekannt ist und somit kommt es zum ""-Leer-NS. Beim zweiten Section-Element darunter ist kein NS mehr nötig, da dieser vom ersten her vererbt wird.

        Wenn also beim xsl:stylesheet-Element der Default-NS steht, dann ist klar, dass alle Elemente diesen verwenden und es wird kein weiterer erzeugt.

        Würde eine Struktur wie

        <Section>...</Section>
        <Section>...</Section>
        <Section>...</Section>

        erzeugt, dann sollte jeweils <Section xmlns=""> herauskommen oder eben nicht, wenn der Default-NS bekannt gemacht wird.

        Comment


        • #5
          Nochmals vielen Dank. Jetzt ist mir die Sache klarer.

          Comment

          Working...
          X