2008-09-03 12 views
35

Я пытаюсь понять, как пространства имен работают в XML. Когда у меня есть элемент типа foo: bar, атрибуты часто не будут иметь пространства имен на них. Но иногда они будут. Является ли атрибут в пространстве имен элемента, даже если объявлено пространство имен по умолчанию? Оглядываясь на xsd для xhtml, кажется, что атрибуты являются частью схемы и должны находиться в пространстве имен для xhtml, но они никогда не представляются таким образом ...пространства имен и атрибуты XML

ответ

2

Читайте также в 6.1 Namespace Scoping и 6.2 Namespace Defaulting на w3c.

В основном:

Область действия объявления пространства имен объявляющего префикса проходит от начала начального тега, в котором он появляется до конца соответствующего конечного тега

Однако , текст здесь, похоже, не объясняет, означает ли, что a - это foo: a или пространство имен по умолчанию в контексте. Я бы предположил, что это не относится к foo: a, а скорее к пространству имен по умолчанию a. Учитывая эту цитату не менее:

Такое объявление пространства имен применяется ко всем именам элементов и атрибутов в пределах своей области действия, префикс которых соответствует указанному в объявлении.

Т.е. пространство имен «Foo:» применяется только к элементам с префиксом Foo:

11

Примеры для иллюстрации использования 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"/> 
+2

Как вы объясните, что в 2-м и 3-м примерах атрибут `qux` не наследует пространство имен` http: // www.foo.com/ `, хотя это пространство имен по умолчанию для элемента? – 2011-01-10 16:00:16

46

В большинстве случаев атрибуты не будут находиться в каком-либо пространстве имен. namespace spec говорит (акцента мой):

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

Там причина, что большинство XML словарей использовать не к пространству имен атрибутов:
Когда ваши элементы имеют имена, и эти элементы имеют атрибуты, то не может быть никакой путаницы: атрибуты принадлежат к вашему элементу, который принадлежит ваше пространство имен. Добавление префикса пространства имен к атрибутам просто сделает все более подробным.

Итак, почему существуют атрибуты с именами?
Потому что некоторые словари делают полезную работу с большей частью атрибутами и могут делать это при смешивании с другими словарями. Наиболее известным примером является XLink.

Наконец, W3C XML Schema имеет слишком легкий путь (<schema attributeFormDefault="qualified">) об объявлении своих атрибутов как в пространстве имен, заставляя вас префикс их в документах, даже при использовании пространства имен по умолчанию.

+1

Это очень знающий ответ, учитывая то, что вы сказали здесь, если бы вы считали это утверждение ложным: «Все атрибуты, где бы они ни были, должны быть префиксны к пространству имен» Контекст: http://stackoverflow.com/ Вопросы/10917416/configuring-an-xml-namespace/10917629 # comment14238724_10917629 (ответ Panda) – 2012-06-06 16:08:04

+0

@Bart Schuller: атрибуты будут наиболее вероятно принадлежать вашему элементу, но им это не обязательно. – 2014-09-16 13:57:28

7

Есть что-то связанное с этим тезисом атрибутов/пространств имен, которое заняло у меня некоторое время, чтобы понять сегодня, когда я работал над 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» вкус, так что я просто решил придерживаться первого решения и объявить все мои атрибуты локально.

 Смежные вопросы

  • Нет связанных вопросов^_^