XSD с элементами из другого пространства имен - PullRequest
21 голосов
/ 20 июня 2011

У меня есть два 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 ]

33 голосов
/ 20 июня 2011

На самом деле существует два разных способа составления документов схемы 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

1 голос
/ 20 июня 2011

Вы можете использовать тег <xsd:import> для импорта схемы с другим пространством имен.

...