XML-Namespaces und Attribute

Ich versuche zu verstehen, wie Namespaces in XML funktionieren. Wenn ich ein Element wie foo:bar habe, haben die Attribute oft keine Namespaces. Aber manchmal werden sie es tun. Ist das Attribut im Namespace des Elements, auch wenn der Standardnamespace deklariert wurde? Wenn man sich die xsd für xhtml anschaut, scheint es, dass die Attribute Teil des Schemas sind und sich im Namespace für xhtml befinden sollten, aber sie werden nie so dargestellt...

Antwort auf "XML-Namespaces und Attribute " 4 von antworten

Lesen Sie bei 6.1 Namespace Scoping and und 6.2 Namespace Defaulting on w3c. auf w3c.

Grundsätzlich:

Der Bereich einer Namespacedeklaration, die ein Präfix deklariert, erstreckt sich vom Anfang des Start-Tags, in dem es bis zum Ende des entsprechenden Endtags

erscheint. Ich gehe davon aus, dass es sich nicht auf foo:a bezieht, sondern auf die Dokumente Standardnamespace a. Zumindest unter Berücksichtigung dieses Zitats:

Eine solche Namespace-Deklaration gilt für alle Element- und Attributnamen innerhalb seines Gültigkeitsbereichs, deren Präfix mit dem in der Deklaration angegebenen übereinstimmt.

Dh. Der Namespace "foo:" gilt nur für Elemente mit dem Präfix foo:

Beispiele zur Veranschaulichung mit dem Clark notation, where the namespace prefix is replaced with the namespace URL in curly brackets: , bei dem das Namespacepräfix durch die Namespace-URL in geschweiften Klammern ersetzt wird:

<bar xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<foo:bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>

ist

<{}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>

Meistens werden Attribute in keinem Namespace angezeigt. Die namespace spec says ( sagt ( Betonung Mine):

Eine Standard-Namespace-Deklaration gilt für alle nicht voreingestellten Elemente Namen innerhalb seines Anwendungsbereichs. Standard-Namespace-Deklarationen gelten für nicht für direkt auf Attributnamen . Die Interpretation von nicht voreingestellten Attributen wird durch das Element bestimmt, auf dem sie erscheinen.

Es gibt einen Grund dafür, dass die meisten XML-Vokabulare nicht namespaced-Attribute verwenden:
Wenn Ihre Elemente über einen Namespace verfügen und diese Elemente Attribute haben, kann es keine Verwechslung geben: Die Attribute gehören zu Ihrem Element, das zu Ihrem Namespace gehört. Das Hinzufügen eines Namespacepräfixes zu den Attributen würde einfach alles ausführlicher machen.

Warum gibt es also Namespaced-Attribute?
Denn einige Vokabeln machen nützliche Arbeit mit meist Attributen und können dies tun, wenn sie mit anderen Vokabeln vermischt werden. Das bekannteste Beispiel ist XLink. .

Schließlich hat W3C XML Schema eine allzu einfache Möglichkeit ( <schema attributeFormDefault="qualified">) of declaring your attributes as being in a namespace, forcing you to prefix them in your documents, ), Ihre Attribute als in einem Namespace zu deklarieren, wodurch Sie gezwungen sind, sie in Ihren Dokumenten voranzuschreiben, sogar , wenn Sie einen Standard-Namespace verwenden.

selbst ist nicht mehr global"

Diese letzte Lösung hat einen "hacky" Geschmack, so dass ich nur beschlossen, mit der ersten Lösung zu bleiben und alle meine Attribute lokal zu deklarieren.

Es gibt etwas, das mit diesem Attribut/Namespaces-Thema zusammenhängt, das mich einige Zeit brauchte, um heute zu verstehen, als ich an einem XSD arbeitete. Ich werde diese Erfahrung mit Ihnen teilen, falls jemand jemals die gleichen Probleme hat.

Im Schemadokument, an dem ich arbeitete, gab es einige globale Attribute, auf die einige Elemente verwiesen wurden. Um die Dinge hier zu vereinfachen, nehmen wir an, dass es sich bei diesem XSD, von dem ich spreche, um einen Kunden handelte.

Nennen wir eines dieser globalen Attribute Id . Und das Root-Element, das es Customer

Meine XSD-Deklaration benutzte, sah so aus:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema  xmlns="http://schemas.mycompany.com/Customer/V1" 
targetNamespace="http://schemas.mycompany.com/Customer/V1" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">

Meine Id Attributdeklaration sah so aus:

<xs:attribute name="Id" type="xs:positiveInteger"/>

Und mein Customer Element verwendete das Attribut wie folgt:

<xs:element name="Customer">
   <xs:complexType>
      <xs:attribute ref="Id" use="required"/>
      <!-- some elements here -->
    </xs:complexType>
</xs:element>

Jetzt, Angenommen, ich wollte ein Customer XML-Dokument wie dieses deklarieren:

<?xml version="1.0" encoding="utf-8"?>
<Customer Id="1" xmlns="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

Ich fand heraus, dass ich nicht : wenn das Attribut global deklariert ist , befindet es sich nicht im gleichen Namespace als das Element, das darauf verweist.

Ich fand heraus, dass die einzige Lösung mit der xSD so definiert war, den Namespace zweimal zu deklarieren: einmal ohne Präfix, um ihn zum Standard-Namespace für Elemente zu machen, und einmal mit einem Präfix, um ihn mit den Attributen zu verwenden. So hätte es also ausgesehen:

<?xml version="1.0" encoding="utf-8"?>
<Customer cus:Id="1" xmlns="http://schemas.mycompany.com/Customer/V1"
 xmlns:cus="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

Das ist so unpraktisch, dass ich gerade beschlossen habe, alle globalen Attribute loszuwerden und sie lokal zu deklarieren. Wich im Falle des Beispiels, das ich hier gegeben habe, hätte so ausgesehen:

<xs:element name="Customer">
   <xs:complexType>
       <xs:attribute name="Id" type="xs:positiveInteger" use="required"/>
       <!-- some elements here -->
   </xs:complexType>
</xs:element>

Ich fand es schwierig, einige Referenzen darüber zu finden, worüber ich hier im Netz spreche. Ich fand schließlich this post in the Stylus XSD Forum where a guy named Steen Lehmann suggested either to declare the attribute locally or to declare it within an attribute group im Stylus XSD Forum, wo ein Mann namens Steen Lehmann vorschlug, das Attribut entweder lokal zu deklarieren oder es innerhalb einer Attributgruppe

zu deklarieren, "damit die Attributdeklaration