Имена атрибутов 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
но подавляющее большинство логически "ограничено" (и, следовательно, связано) с их собственными элементами. Следовательно, нет пространства имен, пока оно вам действительно не понадобится.