Атрибут xsd: force в элементе, если присутствует дочерний элемент
Предположим, у меня есть два элемента, где первый (register
) может содержать несколько секунд (scale
). @unit
атрибут scale
элемент является xs:key
(следовательно, уникальный внутри первого элемента). Это можно назвать как xs:keyref
в атрибуте "defaultScale" register
элемент. Как это:
<xs:element name="register">
<xs:key name="scaleKey">
<xs:selector xpath="scale" />
<xs:field xpath="@unit" />
</xs:key>
<xs:keyref name="chooseDefaultScale" refer="scaleKey">
<xs:selector xpath="."/>
<xs:field xpath="@defaultScale"/>
</xs:keyref>
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="scale"/>
</xs:choice>
<xs:attribute name="defaultScale" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="scale">
<xs:complexType>
<xs:attribute name="scale" type="xs:float" use="required"/>
<xs:attribute name="unit" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
Как я могу заставить @defaultScale
атрибут должен присутствовать и действителен, если хотя бы один scale
ребенок присутствует?
Моей первой попыткой было добавить еще xs:key
в базовый элемент register
, как в try1
а также try2
, Оба не компилируются...
<xs:element name="body">
<xs:key name="try1">
<xs:selector xpath=".//register/defaultScale" />
<xs:field xpath="../@defaultScale" /> <!-- not allowed -->
</xs:key>
<xs:key name="try2">
<xs:selector xpath=".//register[defaultScale]" /> <!-- not allowed -->
<xs:field xpath="@defaultScale" />
</xs:key>
<xs:sequence>
<xs:element ref="register"/>
<xs:sequence>
</xs:element>
Мне разрешено использовать только дочернюю ось в xs:selector
а также xs:field
элементы. Итак, мое лучшее предположение на данный момент: это невозможно?
1 ответ
Чтобы ответить на мой собственный вопрос: невозможно из коробки, нужно использовать XSD 1.1. Смотрите здесь, например.
Обратите внимание, что это не тривиально для оболочки Debian, использующей программное обеспечение foss...