【问题标题】:How to Extend a XSD Restriction/Pattern Value如何扩展 XSD 限制/模式值
【发布时间】:2019-06-15 11:29:47
【问题描述】:

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

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

【问题讨论】:

    标签: xsd attributes restriction


    【解决方案1】:

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

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

    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>
    

    【讨论】:

    • 谢谢@Sprotty...我曾想过使用“联合”选项,但我不知道如何使用它。我按照你的建议添加了它,效果很好!顺便说一句,感谢您提供所有详细信息和示例;这特别有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2012-11-07
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2010-11-10
    • 2015-02-09
    相关资源
    最近更新 更多