Abstract

Nach einer Einführung der Namensräume als Erweiterung zur XML und einem Exkurs über IRIs, URIs, URLs und URCs erfahren Sie, wie Namensräume syntaktisch deklariert werden können. Sie sehen an Beispielen, wie Namensräume schlecht angewendet werden und erfahren, wie Sie es besser machen können. Sie erhalten Kenntnis über die Vorrang-Regelungen bei Namensräumen und erhalten abschließend einen einfachen Regelsatz zur Bestimmung von zu Elementen und Attributen zugeordneten Namensräumen.

Inhalt (XML-Namensräume)

  1. XML-Namensräume [49]

XML-Namensräume

Weil XML in sehr vielen verschiedenen Bereichen verwendet werden kann, ist es sehr erfolgreich. Unter anderem auch, weil es so einfach ist, eine Grammatik (wie beispielsweise eine DTD) für neue Anwendungsfelder zu erstellen und damit für das spezielle Einsatzszenario ein maßgeschneidertes XML Datenmodell zu erstellen. Dies bedeutet, daß Namen in einem XML-Dokument immer im Zusammenhang mit einem bestimmten Schema verstanden/interpretiert werden müssen. Solange ein Dokument nur Namen aus einem Bereich verwendet, ist das ziemlich einfach. Heute aber kombinieren Dokumente Namen aus verschiedenen Anwendungsfeldern. XML-Namensräume bieten einem hier die Möglichkeit, die Namen in XML-Dokumenten mit einem Namensraum (=virtueller Bereich) zu verknüfen und sie so voneinander unterscheidbar und eindeutig identifizierbar zu halten.

XML-Namensräume

XML-Namensräume

Warum Namensräume?

Zwei XML-Dokumente ähnlichen Inhalts

<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<Rechnung>
  <Kunde>
    <KundenNr>4711</KundenNr>
    <Name>Max Mustermann</Name>
    <Anschrift>
      <Straße>Musterplatz 1</Straße>
      <PLZ>12345</PLZ>
      <Ort>Musterstadt</Ort>
    </Anschrift>
  </Kunde>
  <Rechnungsposten>
 ...
 </Rechnungsposten>
</Rechnung>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Rechnung>
  <Rechnungsanschrift>
    <Kunde kundenNr="4711">
      <Name>Max Mustermann</Name>
      <Straße>Musterplatz 1</Straße>
      <PLZ>12345</PLZ>
      <Ort>Musterstadt</Ort>
    </Kunde>
  </Rechnungsanschrift>
  <Lieferanschrift>
   ...
   </Lieferanschrift>
  <Rechnungsposten>
 ...
 </Rechnungsposten>
</Rechnung>

Infoset der beiden Rechnungsdokumente

Knoten, die den selben Inhalt repräsentieren, sind mit identischen Farben markiert.
Zeichen (Character Information Item) sind nicht dargestellt, da sie für diese Betrachtung nicht von Interesse sind.
EInige Elemente und Attribute in beiden Dokumenten verwendet, mit gleichem Inhalt.
Identische Teilbäume bedeuten strukturelle Übereinstimmung (z.B. Name, Ort, PLZ)
Unterschiedliche Teilbäume (z.B. Rechnung, Kunde) zeigen Unterschied in der Struktur auf

Warum Namensräume?

Warum Namensräume?

Warum Namensräume?

Definition Namensraum

XML-Namensräume stellen eine XML-basierte Syntax zur Verfügung, um Element- und Attributnamen eines Vokabulars eindeutig zu identifizieren und so Bedeutungsüberschneidungen durch gleichbenannte Elemente- oder Attribute in zu unterscheidenden Vokabularen auszuschließen. XML-Namensräume bilden damit die notwendige Voraussetzung zur freien dezentralen Entwicklung eigener Vokabulare ohne die Möglichkeit einer späteren Syndikatisierung zu verlieren.

Konzept der Namensräume

Eindeutige Identifikation durch IRIs und URIs

Was steckt hinter URIs?

Aufräumen mit falschen Vorstellungen

Namensraumidentifikation

Jeder XML-Namensraum wird durch eine gültige IRI oder URI identifziert. Diese dient ausschließlich der Benennung, daher muß sie nicht auf eine gültige Ressource verweisen.

IRIs

Syntax von IRIs und URIs

IRI            = scheme ":" ihier-part [ "?" iquery ] [ "#" ifragment ]
ihier-part     = "//" iauthority ipath-abempty
                  / ipath-absolute
                  / ipath-rootless
                  / ipath-empty
iauthority     = [ iuserinfo "@" ] ihost [ ":" port ]
ipath-abempty  = *( "/" isegment )

Beispiele für gültige URIs

Nachfolgend sehen Sie eine Vielzahl gültiger URIs versammelt:

IRIs, URIs, URLs, URNs (1)

IRIs, URIs, URLs, URNs (2)

URL

URN

URC

Namensräume verwenden

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<http://www.example.com/sales:Rechnung>
 <http://www.example.com/sales:Kunde>
  <http://www.example.com/sales:KundenNr>4711</http://www.example.com/sales:KundenNr>
  <http://www.example.com/sales:Name>Max Mustermann</http://www.example.com/sales:Name>
  <http://www.example.com/sales:Anschrift>
   <http://www.example.com/sales:Straße>Musterplatz 1</http://www.example.com/sales:Straße>
   <http://www.example.com/sales:PLZ>12345</http://www.example.com/sales:PLZ>
   <http://www.example.com/sales:Ort>Musterstadt</http://www.example.com/sales:Ort>
  </http://www.example.com/sales:Anschrift>
 </http://www.example.com/sales:Kunde>
 <http://www.example.com/sales:Rechnungsposten>
  ... 
 </http://www.example.com/sales:Rechnungsposten>
</http://www.example.com/sales:Rechnung>

Namensräume verwenden

[4]    NameStartChar   ::=   ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]   NameChar        ::=   NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5]    Name            ::=   NameStartChar (NameChar)*

Namensräume verwenden - Bindung (1/2)

[1] NSAttName          ::=  PrefixedAttName | DefaultAttName
[2] PrefixedAttName    ::=  'xmlns:' NCName [NSC: Reserved Prefixes and Namespace Names]
[3] DefaultAttName     ::=  'xmlns'
[4] NCName             ::=  NCNameStartChar NCNameChar* /* An XML Name, minus the ":" */
[5] NCNameChar         ::=  NameChar - ':'
[6] NCNameStartChar    ::=  NameStartChar - ':'

Namensräume verwenden - Bindung (2/2)

Ein qualifizierter Name ist ein Name, der der Interpretation von Namensräumen unterliegt.

Qualifizerte Namen

[7]   QName          ::=   PrefixedName | UnprefixedName
[8]   PrefixedName   ::=   Prefix ':' LocalPart
[9]   UnprefixedName ::=   LocalPart
[10]  Prefix         ::=   NCName
[11]  LocalPart      ::=   NCName
[4]   NCName         ::=   NCNameStartChar NCNameChar* /* An XML Name, minus the ":" */

Verarbeitung durch XML-Prozessoren

Clark-Notation

Beispiel: Rechnung mit Namensräumen

<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<myNS1:Rechnung xmlns:myNS1="http://www.xyz.com/sales">
   <myNS1:Kunde>
      <myNS1:KundenNr>4711</myNS1:KundenNr>
      <myNS1:Name>Max Mustermann</myNS1:Name>
      <myNS1:Anschrift>
         <myNS1:Strasse>Musterplatz 1</myNS1:Strasse>
         <myNS1:PLZ>12345</myNS1:PLZ>
         <myNS1:Ort>Musterstadt</myNS1:Ort>
      </myNS1:Anschrift>
   </myNS1:Kunde>
   <myNS1:Rechnungsposten>
 <!--...-->
 </myNS1:Rechnungsposten>
</myNS1:Rechnung>

Stil von Namensraumdeklarationen

Beispiele schlechter Namensraumverwendungen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<neurotic>
 <prefix:elem xmlns:prefix="http://ns1.com/">
  <prefix:child>content</prefix:child>
 </prefix:elem>
 <prefix:elem xmlns:prefix="http://ns2.com/">
  <prefix:child>content</prefix:child>
 </prefix:elem>
</neurotic>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<borderline>
 <prefix1:elem xmlns:prefix1="http://ns1.com/">
  <prefix1:child>content</prefix1:child>
 </prefix1:elem>
 <prefix2:elem xmlns:prefix2="http://ns1.com/">
  <prefix2:child>content</prefix2:child>
 </prefix2:elem>
</borderline>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<psychotic xmlns:prefix1="http://ns1.com/" xmlns:prefix2="http://ns1.com/">
 <prefix1:elem>
  <prefix2:child>content</prefix2:child>
 </prefix1:elem>
 <prefix2:elem>
  <prefix1:child>content</prefix1:child>
 </prefix2:elem>
</psychotic>

Beispiel normale Namensraumverwendung (XHTML)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:mml="http://www.w3.org/TR/REC-MathML"
            xmlns:svg="http://www.w3.org/2000/svg">
 <xhtml:head>
  <xhtml:title>XHTML Dokument, mit MathML- und SVG-Inhalten</xhtml:title>
 </xhtml:head>
 <xhtml:body>
  <xhtml:h1>Eine Überschrift</xhtml:h1>
  <mml:math>
  <mml:mrow>
   <mml:mi>x</mml:mi>
   <mml:mo>=</mml:mo>
   <mml:mfrac>
    <mml:mrow>
     <mml:mrow>
      <mml:mo>-</mml:mo>
      <mml:mi>b</mml:mi>
     </mml:mrow>
     <mml:mo>&PlusMinus;</mml:mo>
     <mml:msqrt>
      <mml:mrow>
       <mml:msup>
        <mml:mi>b</mml:mi>
        <mml:mn>2</mml:mn>
       </mml:msup>
       <mml:mo>-</mml:mo>
       <mml:mrow>
        <mml:mn>4</mml:mn>
        <mml:mo>&InvisibleTimes;</mml:mo>
        <mml:mi>a</mml:mi>
        <mml:mo>&InvisibleTimes;</mml:mo>
        <mml:mi>c</mml:mi>
       </mml:mrow>
      </mml:mrow>
     </mml:msqrt>
    </mml:mrow>
    <mml:mrow>
     <mml:mn>2</mml:mn>
     <mml:mo>&InvisibleTimes;</mml:mo>
     <mml:mi>a</mml:mi>
    </mml:mrow>
   </mml:mfrac>
  </mml:mrow>
  </mml:math>
  <svg:svg width="4cm" height="8cm">
   <svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"/>
  </svg:svg>
 </xhtml:body>
</xhtml:html>

Namensraumpräfixe

Beispiel Namensraumauflösung

<abc:ElementA xmlns:abc="http://www.example.com"
      xmlns:xyz="http://www.example.com">
 <ElementB xmlns="http://www.example.com">
  <ElementC/>
 </ElementB>
 <xyz:ElementB>
  <abc:ElementC/>
 </xyz:ElementB>
</abc:ElementA>
<ElementA xmlns="http://www.example.com"
             xmlns:myNamespace="http://www.example.com">
   <foo:ElementB xmlns:foo="http://www.example.com">
      <myNamespace:ElementC/>
   </foo:ElementB>
   <ElementB xmlns="http://www.example.com">
      <myNamespace:ElementC/>
   </ElementB>
</ElementA>

Überschreiben des Vorgabenamensraums

Beispiel Rechnung

<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<myNS1:Rechnung xmlns:myNS1="http://www.xyz.com/sales">
   <myNS1:Kunde>
      <myNS1:KundenNr>4711</myNS1:KundenNr>
      <myNS1:Name>Max Mustermann</myNS1:Name>
      <myNS1:Anschrift>
         <myNS1:Strasse>Musterplatz 1</myNS1:Strasse>
         <myNS1:PLZ>12345</myNS1:PLZ>
         <myNS1:Ort>Musterstadt</myNS1:Ort>
      </myNS1:Anschrift>
   </myNS1:Kunde>
   <myNS1:Rechnungsposten>
 <!--...-->
 </myNS1:Rechnungsposten>
</myNS1:Rechnung>
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<Rechnung xmlns="http://www.xyz.com/sales">
   <Kunde>
      <KundenNr>4711</KundenNr>
      <Name>Max Mustermann</Name>
      <Anschrift>
         <Strasse>Musterplatz 1</Strasse>
         <PLZ>12345</PLZ>
         <Ort>Musterstadt</Ort>
      </Anschrift>
   </Kunde>
   <Rechnungsposten>
  <!--...-->
 </Rechnungsposten>
</Rechnung>

Beispiel XHTML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:mml="http://www.w3.org/TR/REC-MathML"
            xmlns:svg="http://www.w3.org/2000/svg">
 <xhtml:head>
  <xhtml:title>XHTML Dokument, mit MathML- und SVG-Inhalten</xhtml:title>
 </xhtml:head>
 <xhtml:body>
  <xhtml:h1>Eine Überschrift</xhtml:h1>
  <mml:math>
  <mml:mrow>
   <mml:mi>x</mml:mi>
   <mml:mo>=</mml:mo>
   <mml:mfrac>
    <mml:mrow>
     <mml:mrow>
      <mml:mo>-</mml:mo>
      <mml:mi>b</mml:mi>
     </mml:mrow>
     <mml:mo>&PlusMinus;</mml:mo>
     <mml:msqrt>
      <mml:mrow>
       <mml:msup>
        <mml:mi>b</mml:mi>
        <mml:mn>2</mml:mn>
       </mml:msup>
       <mml:mo>-</mml:mo>
       <mml:mrow>
        <mml:mn>4</mml:mn>
        <mml:mo>&InvisibleTimes;</mml:mo>
        <mml:mi>a</mml:mi>
        <mml:mo>&InvisibleTimes;</mml:mo>
        <mml:mi>c</mml:mi>
       </mml:mrow>
      </mml:mrow>
     </mml:msqrt>
    </mml:mrow>
    <mml:mrow>
     <mml:mn>2</mml:mn>
     <mml:mo>&InvisibleTimes;</mml:mo>
     <mml:mi>a</mml:mi>
    </mml:mrow>
   </mml:mfrac>
  </mml:mrow>
  </mml:math>
  <svg:svg width="4cm" height="8cm">
   <svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"/>
  </svg:svg>
 </xhtml:body>
</xhtml:html>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>XHTML Dokument, mit MathML- und SVG-Inhalten</title>
 </head>
 <body>
  <h1>Eine Überschrift</h1>
  <math xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow>
   <mi>x</mi>
   <mo>=</mo>
   <mfrac>
    <mrow>
     <mrow>
      <mo>-</mo>
      <mi>b</mi>
     </mrow>
     <mo>+-</mo>
     <msqrt>
      <mrow>
       <msup>
        <mi>b</mi>
        <mn>2</mn>
       </msup>
       <mo>-</mo>
       <mrow>
        <mn>4</mn>
        <mo>&#160;</mo>
        <mi>a</mi>
        <mo>&#160;</mo>
        <mi>c</mi>
       </mrow>
      </mrow>
     </msqrt>
    </mrow>
    <mrow>
     <mn>2</mn>
     <mo>&#160;</mo>
     <mi>a</mi>
    </mrow>
   </mfrac>
  </mrow>
  </math>
  <svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" svg:width="4cm" svg:height="8cm">
   <ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"/>
  </svg>
 </body>
</html>

Beispiel XHTML - grafische Darstellung

Präfix XOR Vorgabenamensraum

Namensräume im realen Einsatz

Das Beispiel zeigt die Verwendung zweier Vokabulare (SVG und MathML), die beide ein mit set benanntes Element definieren. Die qualifizierten Namen beider Elemente unterscheiden sich, da sie dem Elementnamen die Namensraum-URI voranstellen.

<?xml version="1.0" standalone="yes"?>
<document>
 <svg xmlns="http://www.w3.org/2000/svg">
  <g transform="translate(100,100)">
   <text id="TextElement" x="0" y="0" style="font-family:Verdana; font-size:35.27; visibility:hidden">
   It's alive!
    <set attributeName="visibility" attributeType="CSS" to="visible" begin="3s" dur="6s" fill="freeze"/>
   </text>
  </g>
 </svg>
 
 <math xmlns="http://www.w3.org/1998/Math/MathML">
  <set>
     <ci> b </ci>
     <ci> a </ci>
     <ci> c </ci>
  </set>
 </math>
</document>

Präzedenz von Namensräumen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ElementA xmlns="urn:namspaces:Namespace1"
        xmlns:ns1="urn:namespace:Namespace2">
 <ElementB/>
 <ns1:ElementC/>
</ElementA>

Aufheben von Namensraumzuweisungen

<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<x xmlns:n1="http://www.w3.org">
  <n1:a/> <!-- legal; the prefix n1 is bound to http://www.w3.org -->
  <x xmlns:n1="">
    <n1:a/> <!-- illegal; the prefix n1 is not bound here -->
    <x xmlns:n1="http://www.w3.org">
      <n1:a/> <!-- legal; the prefix n1 is bound again -->
    </x>
  </x>
</x>

Namensräume für Attribute

Beispiel: Attribute mit Namensräumen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Wurzelelement>
 <ElementA xmlns:ns1="http://www.example.com/ns1" xmlns:ns2="http://www.example.com/ns2">
  <ns1:ElementB att1="ijk">
   <ElementD att1="uvw" xmlns="http://www.example.com/ns3">
    <ElementC att2="abc" ns2:att2="xyz"/>
   </ElementD>
  </ns1:ElementB>
 </ElementA>
</Wurzelelement>

Namensraumvererbung

Namensräume, die durch Überschreiben des Vorgabenamensraumes zugewiesen werden wirken sich ausschließlich auf Elemente und deren direkte oder transitive Kindelemente aus, sofern diese den Namensraum nicht wieder verändern.
Namensräume, die durch explizite Präfixangabe zugewiesen werden, wirken sich ausschließlich auf dasjenige Element aus vor dessen Name das Präfix plaziert ist.
Namensräume für Attribute werden ausnahmslos durch explizite Präfixangabe festgelegt und gelten ausschließlich für das Attribut selbst.

Auswertungsregeln für Namensräume

Ein Element befindet sich in demjenigen Namensraum...

  1. ... an den das vorangestellte Präfix gebunden ist.
    Verfügt das Element über kein Namensraumpräfix, so befindet es sich in demjenigen Namensraum ...
  2. ... der auf diesem Element durch Überschreibung des Vorgabenamensraumes definiert wurde.
    Findet für dieses Element keine Überschreibung des Vorgabenamensraumes statt, so befindet es sich in demjenigen Namensraum ...
  3. ... der für das Elternelement gilt, sofern er dort Vorgabenamensraum ist.
    Man beachte: Das gilt im vorangehenden Satz umschließt sich nicht nur die Überschreibung des Vorgabenamensraumes im direkten Elternelement, sondern auch eine dort geltende Namensraumüberschreibung die in dessen Elternelement oder dessen Elternelement ... stattfand.
    Findet in keinem der Elternelemente eine Überschreibung des Vorgabenamensraumes statt, so befindet sich das Element in demjenigen Namensraum ...
  4. ... der leer ist (d.h. im leeren Namensraum).

Ein Attribut befindet sich in demjenigem Namensraum, der durch explizite Präfixangabe festelegt wurde.

Zusammenfassung Namensräume