2009-09-16 2 views
0

Я хотел бы указать структуру базовых дочерних элементов на основе значения атрибута xml. Например:Использование атрибутов для указания структуры элементов в XSD

<param type="uniform"> 
    <high>10</high> 
    <low>0</low> 
</param> 

<param2 type="normal"> 
    <mean>5</mean> 
    <stdev>2.5</mean> 
<param2> 

Есть ли способ проверить этот тип структуры с помощью XSD?

ответ

1

Нет, к сожалению, это область, где отсутствует XSD - вы не можете управлять структурой, основанной на значениях в атрибуте или элементе. XSD строго контролирует структуру.

Для чего-то вроде этого, вы должны использовать другие методы проверки XML, поэтому я предлагаю вам, возможно, захотите взглянуть на Schematron:

Schematron - это подход, в котором вы можете определить такие зависимости («если этот атрибут имеет значение XYZ, то .......»).

Marc

+0

Это то, что я подозревал в этом деле. Спасибо, что подтвердил мои мысли. –

1

Вы можете сделать что-то подобное, используя абстрактный тип.

<xs:complexType name="basePqrameterType" abstract="true"/> 

Вслед за конкретным (бетон) определений типа:

<xs:complexType name="Param_uniform"> 
    <xs:complexContent> 
     <xs:extension base="baseParameterType"> 
      <xs:attribute name="type" use="required" fixed="uniform"/> 
      ...<!--other specific restrictions for type uniform--> 
     </xs:extension> 
     </xs:complexContent> 
</xs:complexType> 

<xs:complexType name="Param_normal"> 
    <xs:complexContent> 
     <xs:extension base="baseParameterType"> 
      <xs:attribute name="type" use="required" fixed="normal"/> 
      ...<!--other specific restrictions for type normal--> 
     </xs:extension> 
     </xs:complexContent> 
</xs:complexType> 

Ваш XML будет выглядеть следующим образом:

<Param xsi:type="Param_normal" type="normal"/> 
<Param xsi:type="Param_uniform" type="uniform"/> 

Таким образом, можно иметь элементы с таким же именем но сдерживают их из-за определения разных типов, НО вы не можете «выбрать» эти типы, используя значение атрибута. Это должно быть doen, используя нотацию «xsi: type».

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