Имена атрибутов XML и элементы в пространстве имен по умолчанию?

Как следует интерпретировать следующее в спецификации пространства имен XML?

Объявление пространства имен по умолчанию применяется ко всем нефиксированным именам элементов в пределах его области. Объявления пространства имен по умолчанию не применяются непосредственно к именам атрибутов; Интерпретация нефиксированных атрибутов определяется элементом, на котором они появляются.

Мое интуитивное понимание состоит в том, что нефиксированные атрибуты должны интерпретироваться как принадлежащие пространству имен элемента, которому они принадлежат. Тем не менее, следующий пример, кажется, доказывает это неверно:

Схема:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" 
           targetNamespace="http://test.com/xsd/foo" version="1.0" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:attribute name="Id" type="xs:string" />
    <xs:element name="Foo">
        <xs:complexType>
            <xs:attribute ref="myns:Id" />
    </xs:complexType>
    </xs:element>
</xs:schema>

Пример, который проходит проверку:

<a:Foo xmlns:a="http://test.com/xsd/foo" a:Id="123" />

Пример, который не проходит проверку:

<Foo xmlns="http://test.com/xsd/foo" Id="123" />

Что дает?

3 ответа

Решение

Здесь есть два отдельных вопроса. Первый касается XML, второй - XML ​​Schema (XSD).

В XML (в частности, как определено в рекомендации пространств имен XML), атрибут без префикса не находится в пространстве имен. Некоторые комментаторы интерпретируют это как означающее, что пространство имен не определено (т. Е. Определено приложением), но обычная и более простая интерпретация заключается в том, что оно является нулевым: пространство имен отсутствует. Большинство спецификаций API будут возвращать нуль, если вы попросите URI пространства имен в этой ситуации, некоторые вернут строку нулевой длины.

В XSD объявление глобального атрибута определяет атрибут в целевом пространстве имен документа XML-схемы, в котором он объявлен, или в отсутствие пространства имен, если содержащийся документ схемы не указывает целевого пространства имен. По этой причине необычно использовать глобальные объявления атрибутов. Обычная техника - объявлять группы атрибутов (иногда группы атрибутов, содержащие один атрибут); любые атрибуты, объявленные в таких группах атрибутов, являются локальными декларациями, а не глобальными декларациями, поэтому они не наследуют целевое пространство имен содержащегося в документе схемы, если вы не скажете attributeFormDefault="qualised", что было бы довольно странно.

Похоже, что атрибут Id интерпретируется вне какого-либо пространства имен и не соответствует схеме, поскольку атрибут в схеме имеет пространство имен. Однако, если схема объявлена ​​по-другому, выполните следующие действия:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" targetNamespace="http://test.com/xsd/foo" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Foo">
        <xs:complexType>
          <xs:attribute name="Id" type="xs:string" />
        </xs:complexType>
    </xs:element>
</xs:schema>

Ранее недействительный документ проверяется и наоборот. Кажется, причина в том, что XML-схема определяет, что пространство имен ettribute определяется либо targetNamespace атрибут его родителя <schema> элемент или, если его нет, целевого пространства имен нет. В последнем случае родитель <complexType> вместо <schema>атрибут не получает пространство имен.

Однако примечание о толковании нефиксированных атрибутов в моем первоначальном вопросе все еще вызывает недоумение.

Посмотрите подробный ответ, который я разместил ранее на похожий вопрос:

Каково поведение getAttributeNS?

Атрибуты не имеют пространства имен, если они не имеют явного префикса. Идея состоит в том, что в отличие от элементов, которые могут смешиваться с другими документами, атрибуты действительно имеют смысл только в объеме элементов, которые их переносят. Есть несколько исключений, таких как xml:lang но подавляющее большинство логически "ограничено" (и, следовательно, связано) с их собственными элементами. Следовательно, нет пространства имен, пока оно вам действительно не понадобится.

Другие вопросы по тегам