Подтвердить что ты не робот

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>

Это кажется мне глупым, поскольку он, кажется, побеждает цель пространства имен по умолчанию. Я надеюсь, что я просто недопонимаю спецификацию.

4b9b3361

Ответ 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 в спецификации пространств имен, на которую вы ссылались:

интерпретация неподписанных атрибутов определяется элементом, на котором они появляются.

Но я также был бы заинтересован в более подробной информации о том, почему было выбрано это конкретное поведение.