XML По умолчанию пространства имен для имен неквалифицированных атрибутов?
Я пытаюсь понять правильную интерпретацию определения "Namespaces in XML 1.0 (Third Edition)" для неквалифицированных пространств имен атрибутов.
"Имя пространства имен для имени без префикса атрибута всегда не имеет значения."
И позже в том же разделе:
"Значение атрибута в объявлении пространства имен по умолчанию МОЖЕТ быть пустым. Это имеет тот же эффект в пределах области объявления, что пространство имен по умолчанию отсутствует."
Итак, если я хочу объявить пространство имен по умолчанию для элемента (и его дочерних элементов), мне также нужно объявить сопоставление пространства имен префиксов для любых атрибутов, которые находятся внутри этого пространства имен?
Например, в этом примере
<parent xmlns="http://example.com/foo">
<child attrib="value">text</child>
<parent>
Я бы интерпретировал вышеприведенное определение, чтобы сказать, что пространство имен attrib
пусто.
Итак, если мне нужно attrib
иметь такое же пространство имен, что и parent
, тогда я был бы вынужден сделать это?
<foo:parent xmlns:foo="http://example.com/foo">
<foo:child foo:attrib="value">text</foo:child>
<foo:parent>
или это?
<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
<child foo:attrib="value">text</child>
<parent>
Это кажется мне глупым, поскольку он, кажется, побеждает цель пространства имен по умолчанию. Я надеюсь, что я просто недопонимаю спецификацию.
Ответы
Ответ 1
Ты прав. Идея атрибутов, не являющихся частью пространства имен по умолчанию, заключается в том, что они считаются существующими в "пространстве имен элементов" — поэтому в этом случае <foo:child/>
считается "пространством имен" для @attrib
. Обратите внимание, что это просто концептуально; там нет API или что-либо, что относится к пространствам имен атрибутов таким образом.
Это было выбрано потому, что несколько элементов могут иметь атрибуты с одинаковыми именами, но разные значения — в отличие от традиционного пространства имен, которое представляет собой набор имен (так что нет дубликатов). В некотором роде он дает больше структуры пространству имен, вместо того, чтобы иметь плоский набор.
Вы можете прочитать об этом в очень старой версии рекомендации Namespaces.
Это соглашение означает, что всякий раз, когда вы видите атрибут prefixed, он представляет некоторую "дополнительную" информацию, которая не связана с основной схемой в документе.
Ответ 2
В спецификаторе вы правильно считаете пространство имен attrib
в первом примере пустым. Однако здесь есть тонкость, которая может быть не очевидна.
Рассмотрим этот пример далее в спецификации элемента с двумя атрибутами с одним и тем же именем (один префикс и другой нефиксированный).
<!-- This is OK, even though an element cannot have two attributes
with the same name -->
<x xmlns:n1="http://www.w3.org"
xmlns="http://www.w3.org" >
<good a="1" n1:a="2" />
</x>
Это соответствует, потому что два атрибута действительно находятся в двух разных пространствах имен:
-
n1:a
принадлежит пространству имен http://www.w3.org
(которое также является пространством имен good
)
-
a
обработан принадлежать к недоступному пространству имен http://wwww.w3.org > good
(и отличается от пространства имен good
).
Обратите внимание, что пространство имен http://wwww.w3.org > good
не существует; например, вы не можете запрашивать атрибуты в этом пространстве имен с помощью XPath. Если вы попросите namespace-uri(\\good\a)
, он будет пустым. Чтобы сделать идею отдельного пространства имен элементов конкретным, я составил пространство имен, у которого есть как пространство имен имен, так и имя вместе с разделителем (>
в любом случае не допускается без привязки к значениям атрибутов).
Теперь, вместо того, чтобы сказать, что два атрибута находятся в двух разных пространствах имен, правильнее сказать, что они принадлежат к двум различным разделам namespace:
-
n1:a
атрибут принадлежит глобальному разделу атрибутов (http://www.w3.org
)
Элемент -
good
принадлежит разделу "Все типы элементов" (также http://www.w3.org
)
-
a
относится к разделу типа элемента элемента good
(т.е. http://wwww.w3.org > good
).
Здесь соответствующая часть спецификации Porges связана с:
A.2 Разделы пространства имен XML
Чтобы поддержать цель создания как квалифицированных, так и неквалифицированных имена, полезные для достижения намеченной цели, мы идентифицируем имена появляющийся в пространстве имен XML как принадлежащий одному из нескольких непересекающихся традиционные (т.е. упорядоченные) пространства имен, называемые пространства имен перегородки. Перегородки:
Раздел Все типы элементов В этом разделе отображаются все типы элементов в пространстве имен XML. Каждый из них имеет уникальную локальную часть; комбинация имени пространства имен и локальной части однозначно идентифицирует тип элемента.
Глобальный раздел атрибутов Этот раздел содержит имена всех атрибутов, которые определены в этом пространстве имен, являются глобальными. Единственной необходимой характеристикой глобального атрибута является то, что его имя будет уникальным в глобальном разделе атрибутов. Эта спецификация не делает никаких утверждений относительно правильного использования таких атрибутов. комбинация имени пространства имен и имени атрибута однозначно идентифицирует глобальный атрибут.
Разделы типа элемента. Каждый тип в разделе "Типы элементов всех элементов" имеет связанное пространство имен, в котором отображаются имена неквалифицированные атрибуты, которые предоставляются для этого элемента. Это традиционное пространство имен, поскольку появление дубликата атрибута XML-имена запрещены. Сочетание имя атрибута с типом элемента и именем пространства имен уникально идентифицирует каждый неквалифицированный атрибут.
В документах XML, соответствующих этой спецификации, имена всех квалифицированные (префиксные) атрибуты присваиваются глобальному атрибуту раздел, а имена всех неквалифицированных атрибутов присваиваются соответствующий раздел для каждого элемента.
Ответ 3
Ваша интерпретация спецификации верна. Некоторое обоснование также приведено во втором абзаце раздела 6.2 в спецификации пространств имен, на которую вы ссылались:
интерпретация неподписанных атрибутов определяется элементом, на котором они появляются.
Но я также был бы заинтересован в более подробной информации о том, почему было выбрано это конкретное поведение.