XSD с элементами из другого пространства имен
У меня есть два XSD, которые определяют разные документы. Сказать A.xsd
определяет элемент ElementA
как корень, с некоторыми сложными правилами. Сейчас B.xsd
определяет элемент ElementB
что предполагается использовать ElementA
где то посередине.
Например, я хочу файл XML для ElementB
выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<ElementB xmlns="http://example.com/namespace/for/ElementB">
<foo>Bla</foo>
<bar>Blub</bar>
<ElementA xmlns="http://example.com/namespace/for/ElementA">
<!-- ... -->
</ElementA>
</ElementB>
затем B.xsd
может выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- And now I want to include ElementA somehow -->
<xs:element name="ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Дело в том, что я не хочу клонировать спецификацию ElementA
в B.xsd
есть и документы, которые просто есть ElementA
как корень (то есть ElementB
это какой-то контейнерный документ).
Итак, как я могу позволить ElementA
в ElementB
пока полностью строится поверх уже существующего XSD?
2 ответа
На самом деле есть два разных способа составления документов схемы XML: <xs:import>
а также <xs:include>
, xs: include предназначен для использования, когда пространство имен содержащегося документа совпадает с тем, на которое ссылается документ, так что это не совсем то, что вы ищете. xs: import лучше подходит для вашей ситуации, когда вам нужно сослаться на все (или подмножество) элементов в ссылочной схеме, и они находятся в другом целевом пространстве имен. Здесь есть вопрос о различиях: в чем разница между xsd: include и xsd: import?,
Во всяком случае, вернемся к этому конкретному вопросу. То, что вы, вероятно, хотите, что-то вроде этого:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns="http://example.com/namespace/for/ElementB"
targetNamespace="http://example.com/namespace/for/ElementB"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:ea="http://example.com/namespace/for/ElementA">
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" />
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd -->
<xs:element name="ElementA" type="ea:ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Хотя вам потребуется A.xsd для создания сложного типа для ElementA, который вы можете использовать в B.xsd, как показано.
В этой статье есть хорошая информация / примеры и обсуждение некоторых различных стратегий компоновки: http://www.xfront.com/ZeroOneOrManyNamespaces.html
Вы могли бы использовать <xsd:import>
тег для импорта схемы с другим пространством имен.