В схеме XSD, как мне сказать, что элемент может иметь любое количество подэлементов, которые должны наследоваться от определенного типа? - PullRequest
5 голосов
/ 19 июня 2009

Скажите, что в моем XSD определены следующие типы:

<complexType name="NamedEntity">
    <attribute name="ix" type="positiveInteger"></attribute>
    <attribute name="sName" type="string"></attribute>
    <attribute name="txtDesc" type="string"></attribute>
</complexType>

<complexType name="Node">
    <complexContent>
        <extension base="tns:NamedEntity">
        </extension>
    </complexContent>
</complexType>

<complexType name="Source">
    <complexContent>
        <extension base="tns:NamedEntity">
            <attribute name="dt" type="dateTime"></attribute>
        </extension>
    </complexContent>
</complexType>

Теперь я хочу выразить, что элемент Node может иметь ноль или более дочерних элементов, которые могут иметь тип Node или Source.

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

Редактировать: Я бы не хотел использовать xsi:type в документе, но имел бы однозначную связь между именем элемента и типом. Похоже, от этого зависит довольно много обработки XML, и я также нахожу ее более читабельной.

Ответы [ 4 ]

1 голос
/ 19 июня 2009

Пожалуйста не используйте xsi:type, если вы можете избежать этого. Это зло . Хорошо, возможно я преувеличиваю, но это делает невозможным анализ документа без глубокого знания схемы, что на практике достаточно плохо.

Что поможет вам: substitutionGroup.

0 голосов
/ 19 июня 2009

Я думаю, что вы хотите группу замещения .

0 голосов
/ 19 июня 2009

Этот может быть за пределами возможностей XSD. Рассматривали ли вы дополнительную проверку с использованием Schematron ?

0 голосов
/ 19 июня 2009

В схеме элемент Node должен содержать ноль или более дочерних элементов типа NamedEntity. В фактическом документе используйте атрибут xsi:type (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"), чтобы выбрать подтип ("Node" или "Source") для каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...