Как установить тип атрибута на основе значения другого атрибута в том же элементе.
Существует форма, которая выглядит следующим образом:
<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-документа.