У меня есть attributeGroup с длинным списком разрешенных атрибутов, например: attr-group, который я импортирую в другой xsd, чтобы ограничить допустимые атрибуты элемента (определенного в другом xsd) с помощью.
Я также хочу разрешить тому же элементу использовать те же атрибуты во втором пространстве имен, скажем, b: attr-group, и хочу использовать один и тот же файл (вместо того, чтобы повторять все атрибуты и определение группы).
Есть ли простой способ сделать это? До сих пор все мои попытки были сорваны пространством имен импорта и должны соответствовать правилу targetNamespace.
Заранее спасибо!
Этот образец также известен как хамелеон .Это означает, что вы включая схему 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:
<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 недействителен.