Импорт xs: attributeGroups в несколько пространств имен xsd - PullRequest
1 голос
/ 17 ноября 2011

У меня есть attributeGroup с длинным списком разрешенных атрибутов, например: attr-group, который я импортирую в другой xsd, чтобы ограничить допустимые атрибуты элемента (определенного в другом xsd) с помощью.

Я также хочу разрешить тому же элементу использовать те же атрибуты во втором пространстве имен, скажем, b: attr-group, и хочу использовать один и тот же файл (вместо того, чтобы повторять все атрибуты и определение группы).

Есть ли простой способ сделать это? До сих пор все мои попытки были сорваны пространством имен импорта и должны соответствовать правилу targetNamespace.

Заранее спасибо!

1 Ответ

3 голосов
/ 17 ноября 2011

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

ОБНОВЛЕНИЕ: учитывая образец XML, предоставленный в комментариях:

Первый файл схемы (AttrGroup.xsxd):

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema 
elementFormDefault="qualified" attributeFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:attributeGroup name="attr-group">
        <xsd:attribute name="attr1" type="xsd:string"/>
        <xsd:attribute name="attr2" type="xsd:int"/>
    </xsd:attributeGroup>
</xsd:schema>

Второй файл схемы (A.xsd):

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

    <xsd:include schemaLocation="AttrGroup.xsd"/>

    <xsd:attributeGroup name="a-group">
        <xsd:attributeGroup ref="attr-group"/>
    </xsd:attributeGroup>

</xsd:schema>

Третий файл схемы (B.xsd):

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

    <xsd:include schemaLocation="AttrGroup.xsd"/>

    <xsd:attributeGroup name="b-group">
        <xsd:attributeGroup ref="attr-group"/>
    </xsd:attributeGroup>
</xsd:schema>

Четвертая схема XML (Element.xsd):

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://tempuri.org/XMLSchema.xsd/a" xmlns:b="http://tempuri.org/XMLSchema.xsd/b">
    <xsd:import namespace="http://tempuri.org/XMLSchema.xsd/a" schemaLocation="A.xsd"/>
    <xsd:import namespace="http://tempuri.org/XMLSchema.xsd/b" schemaLocation="B.xsd"/>

    <xsd:element name="element">
        <xsd:complexType>
            <xsd:attributeGroup ref="a:a-group"/>
            <xsd:attributeGroup ref="b:b-group"/>           
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

XML Schema files layout

Образец действительного XML:

<element xmlns:a="http://tempuri.org/XMLSchema.xsd/a" xmlns:b="http://tempuri.org/XMLSchema.xsd/b" a:attr1="hello" b:attr2="10" />

Образец неверного XML:

<element xmlns:a="http://tempuri.org/XMLSchema.xsd/a" xmlns:b="http://tempuri.org/XMLSchema.xsd/b" a:attr1="hello" b:attr2="10a" />

При проверке в Element.xsd неверного образца я получаю это сообщение об ошибке (на моем инструменте): Произошла ошибка при загрузке [], позиция строки 1 116 Атрибут 'http://tempuri.org/XMLSchema.xsd/b:attr2' недействителен - значение' 10a 'недопустимо в соответствии с его типом данных' http://www.w3.org/2001/XMLSchema:int' - Строка '10a' не являетсядействительное значение Int32.D: ... \ SampleAttrGroup.xml недействителен.

...