Отношения узла схемы XSD - PullRequest
1 голос
/ 23 ноября 2011

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

Моя основная цель - упростить редактирование XML-файлов с помощью подкованных в XML инструментов (предпочтительно Eclipse) с автоматическим заполнением допустимых значений.

Вот вымышленный пример. Допустим, я хочу создать группу персонажей из одного комикса / мультфильма.

<team ref="marvel-heros">
    <member ref="spiderman" />
    <member ref="hulk" />
    <member ref="batman" /><!-- illegal, not in marvel-heros -->
</team>
<team ref="pacman-ghosts">
    <member ref="blinky" />
    <member ref="inky" />
    <member ref="pinky" />
    <member ref="clyde" />
    <member ref="qbert" /><!-- illegal, not in pacman-ghosts -->
</team>

Другие возможные наценки будут

<marvel-heroes>
    <spiderman />
    <hulk />
</marvel-heroes>
<pacman-ghosts>
    <inky />
    <pinky />
</pacman-ghosts>

Конечно, разметку можно изменить, а также использовать пространства имен (хотя я бы предпочел не использовать одно пространство имен на мультфильм / комикс, поскольку их много).

Обратите внимание, что команда marvel и призраки pacman могут появляться несколько раз в одном документе.

Есть ли разумный способ, которым я могу это сделать? Нужно ли создавать внешнюю схему для значений? Или есть способ решить эту проблему, используя сущности или xml включает?

1 Ответ

1 голос
/ 23 ноября 2011

Если вы используете XML-схему, вам лучше использовать второй вид разметки (<marvel-team>...).Только RelaxNG допускает такой механизм проверки с учетом определенных значений атрибутов.Если вы беспокоитесь о внешних документах, возможно, вы можете рассмотреть механизм включения в XML-схеме:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="type.xsd"/>
    <xs:element name="marvel-team" type="marvel-teamType"/>
    <xs:element name="pacman-ghosts" type="pacman-ghostsType"/>
</xs:schema>

А для type.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="marvel-teamType">
        <xs:sequence>
            <xs:element name="spiderman" />
            <xs:element name="hulk" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="pacman-ghostsType">
        <xs:sequence>
            <xs:element name="inky" />
            <xs:element name="pinky" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Только type.xsd долженизменить при добавлении или удалении элементов.

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