如何扩展XSD限制/模式值

时间:2019-01-22 03:12:00

标签: xsd attributes restriction

我正在尝试限制两个可以共享(大部分)相同属性“类型”值的元素的值。我希望能够为一个元素扩展这些值(请参见下面的示例代码-“结束”元素的“值”属性可以与“开始”元素的“值”属性具有相同的条目,但是可以是其他值)。我认为示例中的解决方案不正确;有一个我可以遵循的简单解决方案吗?

<xsd:simpleType name="StartAndEndTypeType">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="(value1|value2|value3"/>
  </xsd:restriction>
</xsd:simpleType>

<xs:element name="Start">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:float">
        <xs:attribute name="Value" type="StartAndEndTypeType"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

<xs:element name="End">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:float">
        <xs:attribute name="Value" type="StartAndEndTypeType|value4"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

1 个答案:

答案 0 :(得分:0)

这可以通过多种方式来完成。

请注意,我已将您的模式方面更改为枚举,因为它在示例中效果更好(但如果需要,可以放回模式方面)

1-限制类型

StartAndEndTypeType包含所有必需的值,然后在StartType中限制不需要的值。

XSD represented graphically using Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2019 BETA (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="StartAndEndTypeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="value1" />
            <xs:enumeration value="value2" />
            <xs:enumeration value="value3" />
            <xs:enumeration value="value4" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="StartType">
        <xs:restriction base="StartAndEndTypeType">
            <xs:enumeration value="value1" />
            <xs:enumeration value="value2" />
            <xs:enumeration value="value3" />
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="Start">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:float">
                    <xs:attribute name="Value" type="StartType" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="End">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:float">
                    <xs:attribute name="Value" type="StartAndEndTypeType" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

2-使用并集扩展基本定义

您定义基本类型StartAndEndTypeType,然后使用xs:union向其中添加要允许的其他值。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2019 BETA (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="StartAndEndTypeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="value1" />
            <xs:enumeration value="value2" />
            <xs:enumeration value="value3" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="EndType">
        <xs:union memberTypes="StartAndEndTypeType">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="value4" />
                </xs:restriction>
            </xs:simpleType>
        </xs:union>
    </xs:simpleType>
    <xs:element name="Start">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:float">
                    <xs:attribute name="Value" type="StartAndEndTypeType" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="End">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:float">
                    <xs:attribute name="Value" type="EndType" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
</xs:schema>