Атрибут 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...

Другие вопросы по тегам