如何扩展 XSD Restriction/Pattern 值

How to Extend a XSD Restriction/Pattern Value

我正在尝试限制可以共享(大部分)相同属性 'type' 值的两个元素的值。我希望能够为其中一个元素扩展这些值(参见下面的示例代码——'End' 元素的 'Value' 属性可以与 'Start' 元素的 'Value' 属性,但可以有其他值)。我不认为我在示例中的解决方案是正确的;有没有我可以遵循的简单解决方案?

<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 - 限制类型

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

<?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>