Разрешение конфликтов имен атрибутов XML

Спецификация XML говорит, что неполные пространства имен не находятся ни в одном пространстве имен. Семантика в спецификации является спорной, но все наборы XML-инструментов были созданы для работы таким образом. Видеть:

Пространства имен XML и атрибуты без префиксов

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

Если неквалифицированные атрибуты не находятся ни в одном пространстве имен, то почему проверка все еще работает? Это противоречие.

И что происходит, когда в области видимости есть два атрибута с одинаковыми именами. Один из пространства имен по умолчанию и один, принадлежащий текущему элементу.

<document xmlns="default.ns" xmlns:hr="humanresources.ns">
  <hr:user id="abc" />
</document>

Если id определено и в default.ns, и в humanresources.ns, но с разными типами данных, скажем, xs:token и xs:integer, какое пространство имен будет id разрешено для проверки, если таковое имеется?

Предполагая, что валидатор ошибется из-за неоднозначности и заставит другие атрибуты быть квалифицированными, тогда мне придется написать вспомогательный метод GetLocalAttribute, чтобы справиться со всем этим?

Нравится:

  • ids = выбрать все атрибуты элемента, где localname равно id
  • b = выберите одно из ids, где пространство имен равно пространству имен элементов
  • если b != ноль { вернуть b }
  • иначе верните одно из ids, где пространство имен равно null

Люк


person Luke Puplett    schedule 28.08.2014    source источник
comment
Предупреждение о педантичности: не только вам не нравится способ определения пространств имен XML, но ваша характеристика ошибочна. Спецификация XML вообще ничего не говорит о пространствах имен. Спецификация пространств имен XML говорит, что неквалифицированные имена не распознаются как принадлежащие какому-либо пространству имен программным обеспечением, совместимым с пространством имен, -- она ​​не говорит, что они не принадлежат ни к одному пространству имен. И большинство инструментов в стеке XML обрабатывают неполные имена как находящиеся в пространстве имен, отличном от всех остальных.   -  person C. M. Sperberg-McQueen    schedule 28.08.2014


Ответы (1)


Если id определен как в default.ns, так и в humanresources.ns, но с разными типами данных, скажем, xs:token и xs:integer, какое пространство имен будет разрешено для проверки, если таковое имеется?

Ни к чему "решено" не будет. Ваш пример XML

<document xmlns="default.ns" xmlns:hr="humanresources.ns">
  <hr:user id="abc" />
</document>

имеет

  • элемент корневого уровня с локальным именем document в пространстве имен default.ns, с
  • один дочерний элемент с локальным именем user в пространстве имен humanresources.ns, с
  • атрибут с локальным именем id без пространства имен

Допустимо это или нет, зависит от определения типа элемента user в схеме HumanResources. Если это указывает, что элементу user разрешен атрибут id, который не находится в пространстве имен, то он действителен независимо от того, объявляет ли какая-либо схема глобальный атрибут с именем id, который находится в соответствующем пространстве имен.

По умолчанию к атрибутам применяются те же правила, что и к элементам в XML-схеме: объявления «глобальных» атрибутов (и элементов) верхнего уровня принадлежат к targetNamespace схемы, а объявления «локальных» атрибутов (и элементов), вложенные в комплексный тип не принадлежат никакому пространству имен. Это можно контролировать с помощью атрибута form в одном объявлении и/или атрибутов elementFormDefault и attributeFormDefault во всей схеме. Итак, схема

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
           targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns">
  <xs:element name="user">
    <xs:complexType>
      <xs:attribute name="id" type="xs:string" />
    </xs:complexType>
  </xs:element>
</xs:schema>

объявляет элемент user в targetNamespace схемы с обязательным атрибутом с именем id без пространства имен, тогда как

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
           targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns">
  <xs:attribute name="id" type="xs:string" />
  <xs:element name="user">
    <xs:complexType>
      <xs:attribute ref="tns:id" />
    </xs:complexType>
  </xs:element>
</xs:schema>

(с атрибутом, объявленным на верхнем уровне) будет означать, что для элемента user требуется атрибут id, который находится в пространстве имен humanresources.ns, т.е.

  <hr:user hr:id="abc" />
person Ian Roberts    schedule 28.08.2014
comment
Это очень полезно, спасибо. Что касается вашего первого примера схемы выше с локальным атрибутом без пространства имен, то будет ли это проверяться?: ... <hr:user hr:id="abc" /> Здесь id квалифицировано, но если я правильно понимаю, в схеме/пространстве имен нет атрибута id (только локальный). - person Luke Puplett; 28.08.2014
comment
@LukePuplett нет, это недействительно. Пространство имен — это часть имени элемента или атрибута, синтаксис, который вы иногда видите для его описания, — {namespace}localname, что может быть более ясным способом думать об этом (хотя это не синтаксис, который вы можете использовать непосредственно в XML). В моей первой версии схемы предполагается наличие атрибута с именем {}id, но в этом xml вместо него указано {humanresources.ns}id. - person Ian Roberts; 28.08.2014