#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>
Это гарантирует, что раздел будет использовать только допустимые макеты при перекрестных ссылках на коллекцию макетов.