首页 > 解决方案 > 如何有条件地验证允许的子元素列表中元素的存在?

问题描述

我有一个包含部分和布局的 xml 架构。我有一系列布局,例如

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

我有参考布局的部分。例如

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

我需要验证存在的layoutsallowedLayouts仅来自<layouts> 如何完成此操作?

标签: xml

解决方案


这就是最终为我工作的东西。

秘诀是使用密钥和 idrefs。

在根元素中,我添加了以下限制。

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

这确保了布局的名称不能在布局集合中重复。

这是在根元素内指定的部分中对外键的限制。

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

以下是如何从sections 集合中的section 链接到 layouts 集合中的布局

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

这是一个示例部分

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

这可确保该部分在交叉引用布局集合时仅使用有效布局。


推荐阅读