Show TOC Anfang des Inhaltsbereichs

Syntaxdokumentation Namensräume  Dokument im Navigationsbaum lokalisieren

Standardverhalten

Standardmäßig werden Namensraumdeklarationen bei der Serialisierung nur dann in das resultierende XML-Dokument geschrieben, wenn das zugehörige Namensraumpräfix als Teil des Namens in einem literalen XML-Element oder Attribut oder einem nicht-literalen Attribut verwendet wird. Eine Namensraumdeklaration wird genau in das Element geschrieben, in dem sie benötigt wird. Namensraumdeklarationen, deren Präfix nicht expizit verwendet wird, werden bei der Serialisierung nicht berücksichtigt.

Bei der Deserialisierung wird die Bindung des Namensraumpräfixes an die korrekte URI überprüft.

Explizite Deklaration

Für XML-Elemente des resultierenden XML-Dokuments, in denen eine Namensraumdeklaration gewünscht ist, obwohl das zugehörige Namensraumpräfix nicht als Teil eines Namens, sondern z.B. als Inhalt eines Attributs verwendet wird, kann diese über den Befehl tt:namespace bei der Serialisierung erzwungen werden. Die Syntax ist wie folgt:

 

<tt:namespace name="prefix"/>

 

Diese Anweisung darf einmal oder mehrmals innerhalb eines literalen XML-Elements vor dessen Unterlementen aufgeführt werden. Jede Anweisung deklariert einen Namensraum für das aktuelle XML-Element mit dem hinter dem Attribut name angegebenen Namensraumpräfix prefix. Das Namensraumpräfix muss im aktuellen Kontext bekannt, d.h. in einem umgebenden XML-Element mit xmlns:prefix="..." definiert worden sein.

Serialisierung von Namensraumdeklarationen

Falls ein umgebendes Element noch keine Deklaration des Namensraums enthält, bewirkt die Anweisung tt:namespace, dass die Definition xmlns:prefix="..." in die Definition des literalen XML-Elements eingefügt wird und damit für das Element und alle seine Unterelemente gilt. Innerhalb des XML-Elements werden keine weiteren Deklarationen dieses Namensraums erzeugt. Insbesondere haben weitere Anweisungen tt:namespace innerhalb des gleichen XML-Elements keine Wirkung mehr.

Deserialisierung von Namensraumdeklarationen

Bei der Deserialisierung hat der Befehl keine Wirkung.

 

Beispiel

Das folgende ST-Programm verdeutlicht die standardmäßige Behandlung von Namensräumen:

 

<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"
              xmlns:abc="www.abc.com" xmlns:xyz="www.xyz.com">

  <tt:root name="ROOT"/>

  <tt:template>

    <X0>
      <context1 xmlns:abc="www.abc.com" attr="abc:uvw">
        <X>...</X>
      </context1>
      <context2>
        <abc:X xyz:attr="xyz">...</abc:X>
        <xyz:Y>...</xyz:Y>
      </context2>

    </X0>
  </tt:template>
</tt:transform>

 

Die Definition des Namensraums mit dem Präfix abc in Element context1 wird in Standard-XML nicht benötigt und bei der Serialisierung weggelassen. In den Unterelementen abc:X und xyz:Y von context2 wird die Deklaration von Namensräumen benötigt und bei der Serialisierung eingefügt. Das Ergebnis einer Serialisierung ist wie folgt:

 

<X0>

  <context1 attr="abc:uvw">
    <X>
     ...
    </X>
  </context1>
  <context2>
    <abc:X xmlns:abc="www.abc.com" xmlns:xyz="www.xyz.com" xyz:attr="xyz">
      ...
    </abc:X>
    <xyz:Y xmlns:xyz="www.xyz.com">
      ...
    </xyz:Y>
 
</context2>

</X0>

 

Das folgende ST-Programm enthält explizite Namensraumdeklarationen:

 

<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"
              xmlns:abc="www.abc.com"
              xmlns:xyz="www.xyz.com">

  <tt:root name="ROOT"/>

  <tt:template>

    <X0>
      <context1 attr="abc:uvw">
        <tt:namespace name="abc" />
        <X>...</X>
      </context1>
      <context2>
        <tt:namespace name="abc" />
        <tt:namespace name="xyz" />
        <abc:X xyz:attr="xyz">...</abc:X>
        <xyz:Y>...</xyz:Y>
      </context2>

    </X0>
  </tt:template>
</tt:transform>

 

Mit den tt:namespace-Befehlen werden explizit Namensraumdeklarationen für die Präfixe abc und xyz in die Elemente context1 und context2 eingefügt. Jetzt kann der Inhalt des Attributs attr von context1 namensraumspezifisch ausgewertet werden und in den Elementen abc:X und xyz:Y von context2 wird die Deklaration von Namensräumen nicht mehr benötigt.

 

<X0>

  <context1 xmlns:abc="www.abc.com" attr="abc:uvw">
    <X>
      ...
    </X>
  </context1>
  <context2 xmlns:abc="www.abc.com" xmlns:xyz="www.xyz.com">
    <abc:X xyz:attr="xyz">
      ...
    
</abc:X>
    <xyz:
Y>
      ...
    </xyz:Y>
  </context2>

</X0>

Ende des Inhaltsbereichs