Я пытаюсь понять, как пространства имен работают в XML. Когда у меня есть элемент типа foo: bar, атрибуты часто не будут иметь пространства имен на них. Но иногда они будут. Является ли атрибут в пространстве имен элемента, даже если объявлено пространство имен по умолчанию? Оглядываясь на xsd для xhtml, кажется, что атрибуты являются частью схемы и должны находиться в пространстве имен для xhtml, но они никогда не представляются таким образом ...пространства имен и атрибуты XML
ответ
Читайте также в 6.1 Namespace Scoping и 6.2 Namespace Defaulting на w3c.
В основном:
Область действия объявления пространства имен объявляющего префикса проходит от начала начального тега, в котором он появляется до конца соответствующего конечного тега
Однако , текст здесь, похоже, не объясняет, означает ли, что a - это foo: a или пространство имен по умолчанию в контексте. Я бы предположил, что это не относится к foo: a, а скорее к пространству имен по умолчанию a. Учитывая эту цитату не менее:
Такое объявление пространства имен применяется ко всем именам элементов и атрибутов в пределах своей области действия, префикс которых соответствует указанному в объявлении.
Т.е. пространство имен «Foo:» применяется только к элементам с префиксом Foo:
Примеры для иллюстрации использования Clark notation, где префикс пространства имен заменяется на URL пространства имен в фигурных скобках:
<bar xmlns:foo="http://www.foo.com/"
foo:baz="baz"
qux="qux"/>
<bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
foo:baz="baz"
qux="qux"/>
<foo:bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
foo:baz="baz"
qux="qux"/>
является
<{}bar
{http://www.foo.com/}baz="baz"
{}qux="qux"/>
<{http://www.foo.com/}bar
{http://www.foo.com/}baz="baz"
{}qux="qux"/>
<{http://www.foo.com/}bar
{http://www.foo.com/}baz="baz"
{}qux="qux"/>
В большинстве случаев атрибуты не будут находиться в каком-либо пространстве имен. namespace spec говорит (акцента мой):
объявление пространства имен по умолчанию применяется ко всем префиксы элементы имен в своей области. Декларации пространства имен по умолчанию делают не применяются непосредственно к атрибуту наименования; интерпретация неподписанных атрибутов определяется элементом, на котором они появляются.
Там причина, что большинство XML словарей использовать не к пространству имен атрибутов:
Когда ваши элементы имеют имена, и эти элементы имеют атрибуты, то не может быть никакой путаницы: атрибуты принадлежат к вашему элементу, который принадлежит ваше пространство имен. Добавление префикса пространства имен к атрибутам просто сделает все более подробным.
Итак, почему существуют атрибуты с именами?
Потому что некоторые словари делают полезную работу с большей частью атрибутами и могут делать это при смешивании с другими словарями. Наиболее известным примером является XLink.
Наконец, W3C XML Schema имеет слишком легкий путь (<schema attributeFormDefault="qualified">
) об объявлении своих атрибутов как в пространстве имен, заставляя вас префикс их в документах, даже при использовании пространства имен по умолчанию.
Это очень знающий ответ, учитывая то, что вы сказали здесь, если бы вы считали это утверждение ложным: «Все атрибуты, где бы они ни были, должны быть префиксны к пространству имен» Контекст: http://stackoverflow.com/ Вопросы/10917416/configuring-an-xml-namespace/10917629 # comment14238724_10917629 (ответ Panda) – 2012-06-06 16:08:04
@Bart Schuller: атрибуты будут наиболее вероятно принадлежать вашему элементу, но им это не обязательно. – 2014-09-16 13:57:28
Есть что-то связанное с этим тезисом атрибутов/пространств имен, которое заняло у меня некоторое время, чтобы понять сегодня, когда я работал над XSD. Я собираюсь поделиться этим опытом с вами на случай, если у кого-нибудь будут такие же проблемы.
В документе схемы я работал над несколькими глобальными атрибутами, на которые ссылаются некоторые элементы. Чтобы упростить ситуацию, давайте предположим, что это XSD, о котором я говорю, было около Customer.
Давайте позвоним один из этих глобальных атрибутов Id. И корневой элемент, используя его Клиент
Моя декларация XSD выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://schemas.mycompany.com/Customer/V1"
targetNamespace="http://schemas.mycompany.com/Customer/V1"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
Моя декларация Id атрибут выглядел следующим образом:
<xs:attribute name="Id" type="xs:positiveInteger"/>
И мой клиента элемента использовал атрибут следующим образом:
<xs:element name="Customer">
<xs:complexType>
<xs:attribute ref="Id" use="required"/>
<!-- some elements here -->
</xs:complexType>
</xs:element>
Теперь, скажем, я хотел бы объявить клиентов XML документа, как это:
<?xml version="1.0" encoding="utf-8"?>
<Customer Id="1" xmlns="http://schemas.mycompany.com/Customer/V1">
<!-- ... other elements here -->
</Customer>
Я узнал, что я не могу: когда атрибут глобально заявил, что это не то же самое пространство имен, чем элемент, который ссылается на него.
Я понял, что единственное решение с XSD, определенным как это, состояло в том, чтобы объявить пространство имен дважды: один раз без префикса, чтобы сделать его пространством имен по умолчанию для элементов и один раз с префиксом, чтобы использовать его с атрибуты. Так вот как это выглядело бы как:
<?xml version="1.0" encoding="utf-8"?>
<Customer cus:Id="1" xmlns="http://schemas.mycompany.com/Customer/V1"
xmlns:cus="http://schemas.mycompany.com/Customer/V1">
<!-- ... other elements here -->
</Customer>
Это так непрактично, что я просто решил избавиться от всех глобальных атрибутов и объявить им их локально. Wich в случае примера, который я дал здесь выглядел бы так:
<xs:element name="Customer">
<xs:complexType>
<xs:attribute name="Id" type="xs:positiveInteger" use="required"/>
<!-- some elements here -->
</xs:complexType>
</xs:element>
мне было трудно найти какие-то упоминания о чем я говорю здесь в сети. В конце концов я нашел this post в Stylus XSD форуме, где парень по имени Стен Lehmann предложил либо объявить атрибут локально или не объявить его в группе атрибутов
«так что объявление атрибута само по себе уже не глобальный»
Это последнее решение имеет «Hacky» вкус, так что я просто решил придерживаться первого решения и объявить все мои атрибуты локально.
Как вы объясните, что в 2-м и 3-м примерах атрибут `qux` не наследует пространство имен` http: // www.foo.com/ `, хотя это пространство имен по умолчанию для элемента? – 2011-01-10 16:00:16