Как расширить ограничение XSD / значение шаблона - PullRequest
0 голосов
/ 22 января 2019

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

<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 голосов
/ 24 января 2019

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

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

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