2014-12-17 2 views
0

Учитывая следующий XML я хочу сослаться на различные упражнения по типу:Ссылка типа XML в XML-схемы

<root> 
    <exercises type="foo"> 
     <text></text> 
    </exercises> 
    <exercises type="bar"> 
     <audio></audio> 
    </exercises> 
</root> 

Я бы установить это так:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<!-- xml def --> 
<xs:element name="root"> 
<xs:complexType> 
    <xs:sequence> 
     <xs:element name="exercises" type="foo-exercises"/> 
     <xs:element name="exercises" type="bar-exercises"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

Но как я явно проверяю определение типа в данном xml? То есть, элементы имеют данный тип? То есть, данные типы проверяются против соответствующего определения?


Edit: Я положил его странно: Моя проблема в том, чтобы ссылаться на «тип»/атрибут не в определении типа, но в ссылке на полях.

Скажите: Я хочу проверить, есть ли на самом деле 3 элемента типа foo и 2 элемента типа bar. Поэтому упражнения не достаточно описательный ...

ответ

2

Я боюсь, что такое определение элемента не может быть достигнуто с помощью XML-схем. Другими словами, вы не можете привязать модель содержимого элемента к определенному значению атрибута этого элемента (или любого другого элемента).

Такой контроль может быть выполнен, например, с помощью Schematron.

+0

Thx много для этого уточнения, а также ссылка на Schematron, например. Это очень помогло! – LeTigre

2

Я предлагаю вам эту схему ..

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="exercises" maxOccurs="unbounded" minOccurs="0" type="exercise"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="exercise"> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="foo"> 
     <xs:complexContent> 
      <xs:extension base="exercise"> 
       <xs:sequence> 
        <xs:element type="xs:string" name="text" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="bar"> 
     <xs:complexContent> 
      <xs:extension base="exercise"> 
       <xs:sequence> 
        <xs:element type="xs:string" name="audio" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

это соответствующий XML ...

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
    <exercises xsi:type="foo"> 
     <text></text> 
    </exercises> 
    <exercises xsi:type="bar"> 
     <audio></audio> 
    </exercises> 
</root> 

Таким образом, вы использовали расширение XSD , See here the reference

+0

thx для быстрого ответа. Но я, вероятно, ошибаюсь. Я действительно хочу проверить тип в схеме. Скажем, я хочу иметь xs: выбор в корне с проверкой достоверности для 2 foo-упражнений и 3-х упражнений. Я расскажу об этом в описании. Извините за неправильное указание. – LeTigre

+0

Оба элемента «root» должны иметь одно и то же «имя» (упражнения)? – Xstian

+0

да. это вопрос на самом деле. это был формат xml, согласованный довольно давно, и теперь нет возможности изменить его. – LeTigre

Смежные вопросы