XML-Standard-namespaces für nicht qualifizierte Attribut-Namen?
Ich versuche zu verstehen, die richtige interpretation der "Namespaces in XML 1.0 (Third Edition)" definition für unqualifizierte attribute namespaces.
"Der namespace-name für eine unprefixed Attribut name hat keinen Wert."
Und später im selben Abschnitt:
"Der Wert des Attributs in einem default-namespace-Deklaration KANN auch leer sein. Dies hat die gleiche Wirkung, die in den Geltungsbereich der Erklärung, dass es keine Standard-namespace."
Also, wenn ich will, zu erklären, ein Standard-namespace für ein element (und seine Kinder), kann ich auch erklären müssen, ein Präfix-Namensraum-mapping-alle Attribute, die sich in diesem namespace?
Zum Beispiel, in diesem Beispiel
<parent xmlns="http://example.com/foo">
<child attrib="value">text</child>
<parent>
Ich würde das interpretieren der obigen definition zu sagen, dass der namespace attrib
leer ist.
So, wenn ich gebraucht attrib
haben den gleichen namespace wie parent
, dann wäre ich gezwungen, dies zu tun?
<foo:parent xmlns:foo="http://example.com/foo">
<foo:child foo:attrib="value">text</foo:child>
<foo:parent>
oder?
<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
<child foo:attrib="value">text</child>
<parent>
Dies scheint dumm zu mir, wie es scheint die Niederlage der Zweck der default-namespaces. Ich hoffe, dass ich mich einfach Missverständnis der spec.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig. Die Idee hinter Attribute nicht Teil des Standard-namespace ist, dass Sie als zu existieren, in ein "element namespace" — also in diesem Fall
<foo:child/>
ist, als "Namensraum" für@attrib
. Beachten Sie, dass dies nur konzeptionelle, es gibt keine API oder etwas, das bezieht sich auf Attribut-namespaces auf diese Weise.Diese wurde gewählt, da mehrere Elemente können Attribute mit dem gleichen Namen, aber verschiedene Bedeutungen — im Gegensatz zu einem traditionellen namespace ist eine Menge von Namen (also keine Duplikate). In einer Art und Weise, es gibt mehr Struktur, um den namespace, anstatt mit einem flachen festgelegt.
Lesen Sie dazu in eine sehr alte version des Namespaces Empfehlung.
Diesem übereinkommen bedeutet, dass, wenn Sie sehen, eine Präfix-Attribut, stellt Sie einige 'zusätzliche' Informationen, die nicht im Zusammenhang mit der Haupt-schema in das Dokument.
<foo:child />
ist der "namespace" für@attrib
", dann würde ich nicht zusätzliche Präfixe an die namespace. In anderen Worten, es wäre unqualifiziert, das würde so interpretiert werden, dass in welchem Namensraum das element verwendet wird. Ist das richtig? Das impliziert für mich, dass mein erstes Beispiel ist in der Tat ein guter Weg, dies zu schreiben."it would be unqualified which would be interpreted as being in whatever namespace the element is using"
... das ist die Idee, aber beachten Sie, dass das Attribut nicht melden, dass Sie den gleichen Namensraum wie das element oder das element als 'namespace'. Es wird kein namespace — Attribut mit dem element als "Namensraum" ist nur eine Konvention.Pro spec, sind Sie richtig zu berücksichtigen, wird der namespace des
attrib
im ersten Beispiel werden leer. Jedoch gibt es eine Feinheit hier, die nicht sofort offensichtliche.Betrachten Sie das Beispiel weiter unten in der spec von einem element mit zwei Attributen mit dem gleichen Namen (ein Präfix und ein weiteres unprefixed).
Dies ist konform, weil die beiden Attribute sind in der Tat in zwei verschiedenen namespaces:
n1:a
gehört zuhttp://www.w3.org
namespace (das ist der namespace, dergood
auch)a
ist behandelt gehören unzugänglich namespacehttp://wwww.w3.org > good
(und andere aus dem Namensraum vongood
).Beachten Sie, dass
http://wwww.w3.org > good
- namespace nicht vorhanden ist; zum Beispiel, können Sie keine Abfrage für Attribute in diesem namespace, die mit XPath. Wenn Sie Fragen, fürnamespace-uri(\\good\a)
, wird es leer sein. Um die Idee von einem separaten element namespace Beton, ich habe einen namespace, der sowohl das element namespace und name zusammen mit einem separator (>
ist nicht zulässig ohne Umschreibung in der Attribut-Werte sowieso).Nun, anstatt zu sagen, dass die beiden Attribute sind in zwei verschiedenen namespaces, es ist richtiger zu sagen, dass Sie gehören zu zwei verschiedenen Namensraum-Partitionen:
n1:a
Attribut gehört zu der Global Attribute Partition (http://www.w3.org
)good
element gehört zu Allen Element-Typen Partition (auchhttp://www.w3.org
)a
gehört zu der Pro-Element-Typ Partition -good
(d.h.,http://wwww.w3.org > good
).Hier ist der relevante Teil der Spezifikation Porges verbunden:
<xsd:attribute>
(siehe dieses Beispiel), wird es in in Der Global Attribute Partition und daher muss vorangestellt werden?Ihre interpretation der Spezifikation korrekt ist. Irgendeine Art von Begründung ist auch im zweiten Absatz von Abschnitt 6.2 in der namespaces spec Sie verwiesen:
Aber ich wäre auch daran interessiert, etwas mehr details, warum dieses bestimmte Verhalten wurde gewählt.
Fand ich die ausdrückliche Erklärung in "XML in a Nutshell" von Elliotte Rusty Harold: