如何在XML Schema中合并多个枚举?

时间:2015-08-27 12:15:12

标签: xml xsd xml-validation

我可以将多个枚举从不同的* .xsd文件组合成单个枚举,如下所示吗?

第一个文件内容:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified" targetNamespace="http://module1namespace"
            xmlns:tns="http://module1namespace">
    <xsd:simpleType name="LocalEnum">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="LocalEnumValue1" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

第二个文件内容:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified" targetNamespace="http://module2namespace"
            xmlns:tns="http://module2namespace">
    <xsd:simpleType name="LocalEnum">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="LocalEnumValue2" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

合并文件内容:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified" targetNamespace="http://controllernamespace"
            xmlns:tns="http://controllernamespace">
   <xsd:import namespace="module1namespace" schemaLocation="pathToFirstXsd"/>
   <xsd:import namespace="module2namespace" schemaLocation="pathToSecondXsd"/>
....
</xsd:schema>

等于:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified" targetNamespace="http://controllernamespace"
            xmlns:tns="http://controllernamespace">
   <xsd:simpleType name="GlobalEnum">
     <xsd:restriction base="xsd:string">
        <xsd:enumeration value="LocalEnumValue1" />
        <xsd:enumeration value="LocalEnumValue2" />
     </xsd:restriction>
   </xsd:simpleType>
</xsd:schema>

1 个答案:

答案 0 :(得分:2)

您可以通过xsd:union合并两个枚举。

这是一个完整的工作示例,它还修复了名称空间声明和引用的一致性:

Main.xsd

感谢sergioFC在这里使用@memberTypes的好建议,这比将单独的simpleType子项联合起来更清晰:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://controllernamespace"
            xmlns:m1="http://module1namespace"
            xmlns:m2="http://module2namespace">

  <xsd:import namespace="http://module1namespace" schemaLocation="1.xsd"/>
  <xsd:import namespace="http://module2namespace" schemaLocation="2.xsd"/>

  <xsd:simpleType name="GlobalEnum">
    <xsd:union memberTypes="m1:LocalEnum m2:LocalEnum"/>
  </xsd:simpleType>

</xsd:schema>

1.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://module1namespace">
  <xsd:simpleType name="LocalEnum">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="LocalEnumValue1" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

2.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://module2namespace">
  <xsd:simpleType name="LocalEnum">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="LocalEnumValue2" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>