Announcement

Collapse
No announcement yet.

Namespace-Deklaration im Root-Element erzwingen

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

  • Namespace-Deklaration im Root-Element erzwingen

    Hallo,

    wenn ich so das Web durchsuche, dürfte es gar nicht sein...

    Kleines Beispiel ..

    Source XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    </root>

    XSL:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" xmlns:xalan="http://xml.apache.org/xslt"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xslutput method="xml" indent="yes" />

    <xsl:template match="/">
    <xsl:element name="tag">
    <xsl:element name="tag2">
    <xsl:attribute name="xsi:attr">xy</xsl:attribute>
    </xsl:element>
    <xsl:element name="tag2">
    <xsl:attribute name="xsi:attr">xy</xsl:attribute>
    </xsl:element>
    </xsl:element>
    </xsl:template>
    </xsl:stylesheet>

    Output XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <tag>
    <tag2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:attr="xy"/>
    <tag2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:attr="xy"/>
    </tag>


    Anstatt, das der xsi Namespace einmal am Root-Tag hängt, wird er an jedes Element gehangen.
    Eigentlich müsste ich das exclude-result-prefixes Attribut für dieses Verhalten verwenden, tue ich aber nicht.
    Wie erzwinge ich denn, das das xmlns:xsi in das root-Element gelangt ?

    Danke
    Joerg

  • #2
    Mit Saxon erhalte ich so die gewünschte Ausgabe (ich habe literale Elemente/Attribute statt xsl:element und xsl:attribute verwendet, da es zumindest im Beispiel keinen Grund für deren Verwendung gibt):

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
      xmlns:xalan="http://xml.apache.org/xslt"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xalan">
    
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="/">
        <tag>
          <tag2 xsi:attr="xy"/>
          <tag2 xsi:attr="xy"/>
        </tag>
      </xsl:template>
      
    </xsl:stylesheet>
    Ergebnis:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <tag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <tag2 xsi:attr="xy"/>
       <tag2 xsi:attr="xy"/>
    </tag>
    Zuletzt editiert von Thomas Meinike; 29.04.2008, 11:29.

    Comment


    • #3
      Hmm..

      Dein Beispiel hat auch bei mir funktioniert und letztlich reichte es z.B. nur den "tag" literal zu schreiben.
      Ich habe mir das xsl:element und xsl:attribute angewöhnt, um nicht in Verschachtelungsprobleme zu kommen und auch keine Freizeichen und Zeilenumbrüche zu provozieren.

      Gibt es noch einen grundsätzlichen Unterschied zwischen "<tag>" und "<xsl:element name='tag'>" der so ein Verhalten mit dem Namespace provoziert?

      Comment


      • #4
        Nein, dieses Namnesraum-Verhalten hat nichts mit der Schreibweise zu tun. Es werden jeweils Elemente im entsprechenden NS erzeugt. Allerdings sollte man xsl:element und xsl:attribut nur dann nutzen, wenn sich deren Namen oder Inhalte erst dynamisch ergeben, also aus dem XML-Content abgeleitet werden. Die häufige unreflektierte Verwendung hat IMHO irgendwie mit schlechten Beispielen aus Büchern zu tun.

        Im genannten Beispiel gibt es den xalan- und den xsi-NS. Da der xalan-NS durch exclude-result-prefixes entfernt wird, bleibt der xsi-NS zurück und bildet somit den Default-NS für das Ausgabedokument.

        Comment

        Working...
        X