Неквалифицированные ссылки на глобальные атрибуты XSD - PullRequest
4 голосов
/ 18 января 2012

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

Ограничения

  • Атрибут не может быть локальным для элемента

(неверно) Схема

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:attribute name="sample-attribute" type="xs:string" />

    <xs:element name="sample-element">
        <xs:complexType>
            <xs:attribute ref="sample-attribute" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>

Экземпляр

<?xml version="1.0" encoding="utf-8"?>
<sample-element xmlns="http://tempuri.org/XMLSchema.xsd" sample-attribute="test" />

Ответы [ 2 ]

9 голосов
/ 15 апреля 2012

Да.

Обернуть (глобальный) элемент xs:attribute в элемент xs:attributeGroup.

В элементе xs:element см. Элемент xs:attributeGroup.

Атрибут name элемента xs:attributeGroup может иметь то же значение, что и атрибут name элемента xs:attribute.

Схема

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:attributeGroup name="sample-attribute">
      <xs:attribute name="sample-attribute" type="xs:string" use="required"/>
    </xs:attributeGroup>

    <xs:element name="sample-element">
      <xs:complexType>
        <xs:attributeGroup ref="sample-attribute" />
      </xs:complexType>
    </xs:element>
</xs:schema>

Информацияне имеет прямого отношения к вопросу

Это не расширение вышеупомянутого ответа и не альтернативный ответ, а просто связанная информация, которая может оказаться вам полезной (это не входит в рамки вашего вопроса).

Вы можете оставить исходную схему нетронутой и явно указать (добавить префикс пространства имен) имя атрибута в экземпляре документа, например так:

<?xml version="1.0" encoding="utf-8"?>
<t:sample-element
    xmlns:t="http://tempuri.org/XMLSchema.xsd"
    t:sample-attribute="test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://tempuri.org/XMLSchema.xsd sample.xsd"/>

(обратите внимание на префикс пространства имен t: накак имя корневого элемента, так и имя атрибута.)

5 голосов
/ 18 января 2012

Пространства имен в XML гласят, что «Имя пространства имен для имени атрибута без префикса всегда не имеет значения»; с другой стороны, вы ограничили атрибут, чтобы он не был локальным, поэтому единственный способ сделать это (кредит @GrahamHannington) состоит в том, чтобы обернуть его в группу атрибутов, что позволяет повторно использовать определение атрибута. без квалификации.

...