Использование атрибутов для определения структуры элемента в XSD - PullRequest
0 голосов
/ 16 сентября 2009

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 декабря 2009

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

<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"/>

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

1 голос
/ 16 сентября 2009

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

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

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

Марк

...