Как расширить значение ограничения/шаблона XSD

Я пытаюсь ограничить значения для двух элементов, которые могут использовать (большинство) одни и те же значения атрибута «тип». Я хотел бы иметь возможность расширить эти значения для одного из элементов (см. пример кода ниже — атрибут «Значение» элемента «Конец» может иметь те же записи, что и атрибут «Значение» элемента «Начало», но есть могут быть дополнительные значения). Я не думаю, что мое решение в примере правильное; есть ли простое решение, которому я могу следовать?

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

person Mark Linebarger    schedule 22.01.2019    source источник


Ответы (1)


Это можно сделать несколькими способами.

Примечание. Я изменил ваш фасет шаблона на перечисление, так как он лучше подходит для примера (но при необходимости фасет шаблона можно вернуть обратно)

1 – Ограничение типа

StartAndEndTypeType содержит все необходимые значения, а затем вы ограничиваете те, которые вам не нужны, в StartType.

XSD, представленный графически с помощью 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>
person Sprotty    schedule 24.01.2019
comment
Спасибо @Sprotty ... Я думал о варианте объединения, но не знал, как его использовать. Я добавил его, как вы предложили, и он отлично работает! Кстати, спасибо за все подробности и примеры; это было особенно полезно. - person Mark Linebarger; 24.01.2019