Как выбрать тип атрибута XSD относительно значения атрибута родного брата - PullRequest
0 голосов
/ 30 апреля 2018

Как установить тип атрибута на основе значения другого атрибута в том же элементе.

Существует форма, которая выглядит следующим образом:

<Products>
    <Product ProductCodeType="Default" ProductCode"789" />
    <Product ProductCodeType="Manufacturer" ProductCode"1234567891011" />
    <Product ProductCodeType="Supplier" ProductCode"Big1324" />
    <Product ProductCodeType="Default" ProductCode"7777777" />
</Products>

Существует три вида кода продукта, каждый из которых должен соответствовать определению, определенному атрибутом ProductCodeType.

  • По умолчанию используется число от трех до семи цифр.
  • Производство также числовое, но всегда должно быть 13 цифрами.
  • Поставщик алфавитно-цифровой без определенной длины.

Я рассмотрел утверждения и альтернативы в отношении Условное присвоение типа и выборы . Я, наверное, упускаю что-то простое и очевидное.

Для общепринятой точки зрения я предлагаю игнорировать следующие примеры XSD, поскольку они не приблизили меня к решению.

<xs:element name="Products" type="Prods" />

<xs:complexType name="Prods">
    <xs:sequence>
        <xs:element name="Product" maxOccurs="unbounded" type="abstractType" />
    </xs:sequence>
</xs:complexType>

Альтернативы:

<xs:complexType name="Prod">
        <xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
        <xs:attribute name="ProductCode" >
                <xs:alternative test="@ProductCodeType = 'Default'" type="def" />
                <xs:alternative test="@ProductCodeType = 'Manufacturer'" type="manu" />
                <xs:alternative test="@ProductCodeType = 'Supplier'" type="sup" />
        </xs:attribute>
</xs:complexType>

Абстрактные альтернативы:

 <xs:complexType name="abstractType" abstract="true">
    <xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
</xs:complexType>

<xs:complexType name="Switch">
    <xs:complexContent>
        <xs:extension base="abstractType">
            <xs:attribute name="ProductCode">
                <xs:simpleType>
                <xs:alternative test="@ProductCodeType = 'Default'" type="def" />
                <xs:alternative test="@ProductCodeType = 'Manufacturer'" type="manu" />
                <xs:alternative test="@ProductCodeType = 'Supplier'" type="sup" />
                </xs:simpleType>
            </xs:attribute>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Абстрактные утверждения

 <xs:complexType name="abstractType" abstract="true">
    <xs:attribute name="ProductCodeType" type="Prod"/>
</xs:complexType>

<xs:complexType name="deft">
    <xs:complexContent>
        <xs:extension base="abstractType">
            <xs:attribute name="ProductCode" type="def" />
            <xs:assert test="@ProductCodeType = 'Default'"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="manuf">
    <xs:complexContent>
        <xs:extension base="abstractType">
            <xs:attribute name="ProductCode" type="Manufacturer" />
            <xs:assert test="@ProductCodeType = 'manu'"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="suppr">
    <xs:complexContent>
        <xs:extension base="abstractType">
            <xs:attribute name="ProductCode" type="Supplier" />
            <xs:assert test="@ProductCodeType = 'sup'"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>-

Перечисления типов продуктов и определения типов.

<xs:simpleType name="ProdCoTyp">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Default"/>
        <xs:enumeration value="Manufacturer"/>
        <xs:enumeration value="Supplier"/>
    </xs:restriction>
</xs:simpleType>

    <xs:simpleType name="def">
    <xs:restriction base="xs:integer">
        <xs:minExclusive value="99"/>
        <xs:maxInclusive value="9999999"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="manu">
    <xs:restriction base="xs:integer">
        <xs:minExclusive value="999999999999"/>
        <xs:maxInclusive value="9999999999999"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="sup" >
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9a-zA-Z]*" />
    </xs:restriction>
</xs:simpleType>

Для ясности я получаю сообщения об ошибках, например, но не ограничиваясь ими:

S4s-elt-must-match.1: Содержимое 'simpleType' должно совпадать (аннотация ?, (ограничение | Список | Союз)). Обнаружена проблема, начиная с: Альтернатива.

И

S4s-elt-must-match.1: содержимое 'ProductCode' должно совпадать (аннотация ?, (simpleType?)). Обнаружена проблема, начиная с: Альтернатива.

И

S4s-elt-invalid-content.1: Недопустимое содержимое deft. Элемент «утверждать» неверен, неуместен или встречается слишком часто.

Эти сообщения об ошибках указывают на неудачное состояние, в котором цель проверки назначения условных типов для атрибутов не достигается. Я использую онлайн-инструменты для проверки моего XSD по макету XML-документа.

1 Ответ

0 голосов
/ 02 мая 2018

ОК, это предлагаемая схема для того, чего вы хотели бы достичь, благодаря использованию <xs:alternative> s - я построил это на некоторых ваших попытках получить определения простых типов для ваших атрибутов.

Я добавил несколько комментариев в схему, чтобы дать вам некоторые пояснения.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">

    <xs:element name="Products" type="Prods" />

    <xs:complexType name="Prods">
        <xs:sequence>
            <xs:element ref="Product" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <!-- Calling alternative definitions, depending on the ProductCodeType value -->
    <xs:element name="Product" type="Prod">
        <xs:alternative test="@ProductCodeType = 'Default'" type="ProdDefault"/>
        <xs:alternative test="@ProductCodeType = 'Manufacturer'" type="ProdManufacturer"/>
        <xs:alternative test="@ProductCodeType = 'Supplier'" type="ProdSupplier"/>
    </xs:element>

    <!-- Definition for the ProductCodeType attribute -->
    <xs:simpleType name="ProdCoTyp">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Default"/>
            <xs:enumeration value="Manufacturer"/>
            <xs:enumeration value="Supplier"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Prod" abstract="true">
        <xs:attribute name="ProductCodeType" type="ProdCoTyp"/>
    </xs:complexType>

    <!-- The alternative content definitions for a <Product> -->
    <xs:complexType name="ProdDefault">
        <xs:complexContent>
            <xs:extension base="Prod">
                <xs:attribute name="ProductCode" type="def"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ProdManufacturer">
        <xs:complexContent>
            <xs:extension base="Prod">
                <xs:attribute name="ProductCode" type="manu"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ProdSupplier">
        <xs:complexContent>
            <xs:extension base="Prod">
                <xs:attribute name="ProductCode" type="sup"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- the definitions for the Default, Manufacturer and Supplier-specific @ProductCode -->
    <xs:simpleType name="def">
        <xs:restriction base="xs:integer">
            <xs:minExclusive value="99"/>
            <xs:maxInclusive value="9999999"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="manu">
        <xs:restriction base="xs:integer">
            <xs:minExclusive value="999999999999"/>
            <xs:maxInclusive value="9999999999999"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="sup" >
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9a-zA-Z]*" />
        </xs:restriction>
    </xs:simpleType>

</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...