Как я могу условно проверить наличие элемента из списка разрешенных дочерних элементов?

#xml

#xml

Вопрос:

У меня есть xml-схема, которая содержит разделы и макеты. У меня есть коллекция макетов, например

 <layouts>
    <layout name="wiki" type="page"/>
</layouts>
  

У меня есть разделы, которые ссылаются на макеты. например

 <section name="intro-page">
    <allowedLayouts>
        <layout name="wiki" type="page"/>
    </allowedLayouts>
</section>
  

Мне нужно проверить, что layout s, присутствующие в allowedLayouts , выбираются только из <layouts>
Как мне это сделать?

Комментарии:

1. Что именно вы подразумеваете под «ссылкой»?

2. В примере, который я привел. У меня есть список доступных макетов, которые я определяю в коллекции макетов. У меня есть разделы, которые могут использовать макеты. Но я должен указать весь элемент макета внутри раздела. Как я могу добавить ограничение в файл xml, чтобы разрешить только определенные макеты.

Ответ №1:

Вот что в итоге сработало для меня.

Секрет заключается в использовании ключей и идентификаторов.

В корневом элементе я добавляю следующие ограничения.

 <xs:key name="PK_layout">
    <xs:selector xpath="layouts/layout"/>
    <xs:field xpath="@name"/>
</xs:key>
  

Это гарантирует, что имя макета не может быть продублировано в коллекции layouts .

Вот ограничение на внешний ключ в разделе, указанном внутри корневого элемента.

 <xs:keyref name="FK_sectionToLayout" refer="PK_layout">
    <xs:selector xpath="sections/section/allowedLayouts/layout"/>
    <xs:field xpath="@layoutid"/>
</xs:keyref>
  

Вот как создать ссылку на макет в коллекции layouts из раздела в коллекции sections

 <xs:element name=section>
...
    <xs:attribute name="layoutid type="xs:IDREF"/>
...
</xs:element>
  

Вот пример раздела

 <section name="intro-page">
    <allowedLayouts>
        <layout layoutid="wiki"/>
    </allowedLayouts>
</section>
  

Это гарантирует, что раздел будет использовать только допустимые макеты при перекрестных ссылках на коллекцию макетов.