XSD包含来自其他命名空间的元素

时间:2011-06-20 14:54:07

标签: xml xsd xml-namespaces

我有两个XSD定义不同的文档。假设A.xsd将元素ElementA定义为根,具有一些复杂的规则。现在B.xsd定义了一个元素ElementB,它应该在其间的某处使用ElementA

例如,我希望ElementB的XML文件如下所示:

<?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作为根(即{ {1}}是某种容器文档。)

那么,如果完全建立在已经存在的XSD之上,我如何在ElementB内允许ElementA

2 个答案:

答案 0 :(得分:32)

实际上有两种不同的方式来组合XML Schema文档:<xs:import><xs:include>。 xs:include旨在当包含文档的命名空间与被引用文档的名称空间相同时使用,因此它不是您正在寻找的内容。当您需要引用引用模式中的所有(或子集)元素并且它们位于不同的目标名称空间中时,xs:import更适合您的情况。这里有一个关于差异的问题:What's the difference between xsd:include and 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 :(得分:1)

您可以使用<xsd:import>标记导入具有其他命名空间的架构。