Один или несколько элементов, по крайней мере, один с заданным значением для атрибута

1

Мне нужно описать следующее в схеме XML: один элемент должен встречаться 1 или более раз, но только одно вхождение этого элемента должно иметь атрибут "свойства", установленный в значение "nav",

Пример:

<manifest>
    <item href="example" id="02" properties="cover-image" /> <!-- optional item -->
    <item href="dummy" id="sample" properties="nav" /> <!-- mandatory item with "nav" value for "properties" attribute -->
    <item href="example" id="02" properties="mathlm scripted" /> <!-- optional item -->
</manifest> 

Моя "лучшая" попытка была:

    <xs:element name="manifest">
      <xs:complexType>
        <xs:choice>
          <xs:element name="item" minOccurs="1" maxOccurs="1" ><!-- at least one (item property="nav")-->
            <xs:complexType>
              <xs:attribute name="href" type="xs:string" use="required" />
              <xs:attribute name="id" type="xs:string" use="required" />
              <xs:attribute name="media-type" type="xs:string" use="required" />
              <xs:attribute name="fallback" type="xs:string" />
              <xs:attribute name="properties" type="xs:string" use="required" fixed="nav" />
              <xs:attribute name="media-overlay" type="xs:string" />
            </xs:complexType>
          </xs:element>
          <xs:element name="item" minOccurs="0" maxOccurs="unbounded" >
            <xs:complexType>
              <xs:attribute name="href" type="xs:string" use="required" />
              <xs:attribute name="id" type="xs:string" use="required" />
              <xs:attribute name="media-type" type="xs:string" use="required" />
              <xs:attribute name="fallback" type="xs:string" />
              <xs:attribute name="properties" type="xs:string" />
              <xs:attribute name="media-overlay" type="xs:string" />
            </xs:complexType>
          </xs:element>
        </xs:choice>
        <xs:attribute name="id" type="xs:string" />
      </xs:complexType>
    </xs:element>

Плохая попытка, хотя, поскольку валидатор дает мне следующую ошибку:

локальный сложный тип: модель контента не является детерминированной.

Ясно, что эта схема не является детерминированной, поскольку валидатор не может решить, должен ли он проверять обнаруженный item элемента с первым или вторым из двух определений для этого элемента...
... но как я могу это достичь? Это вообще возможно?

  • 1
    Можете ли вы использовать схему 1.1? В этом случае вы можете использовать утверждения ( <xsd:assert> ).
  • 0
    @potame Я не могу найти ответ прямо сейчас, но я думаю, что не могу (используя DOMDocument::schemaValidate() в php.) У меня была другая проблема несколько месяцев назад (условный дочерний элемент в зависимости от атрибута "type" родительского элемента) и я помню ответ, который я нашел: это будет возможно, когда php интегрирует схему 1.1 ... Хотя я буду искать дальше в этом направлении.
Теги:
xsd
xsd-1.0

1 ответ

3
Лучший ответ

Этого нельзя достичь с помощью XSD 1.0, для этого требуется XSD 1.1 и утверждения. Я не думаю, что ваш валидатор схемы по умолчанию в PHP будет поддерживать XSD 1.1.

  • 0
    Затем либо я просто отброшу этот тест, либо попробую что-то вроде первого шага XSLT, преобразующего item[@properties='nav'] в item_nav , затем второй шаг XSD, проверяющий это с одним обязательным элементом item_nav и x факультативная item элементы ... кажется довольно длинным путем для того, что я думал , был просто необходимо :-(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню