XSD架构节点关系

时间:2011-11-23 10:18:46

标签: xml xsd

我正在创建一个XML模式,我希望通过其父节点的类型或值来限制节点值。问题是,我不知道模式创作时的限制,因为模式必须对多个这样的应用程序有效。所以我想将值类型保存在外部文档中(可能会在编辑文档之前自动创建)。

我的主要目的是使用XML-savvy工具(最好是Eclipse)轻松编辑XML文件,并自动完成允许的值。

这是一个虚构的例子。假设我想创建一组来自同一漫画/漫画的角色。

<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>

当然可以更改标记,也可以使用命名空间(虽然我不想每个卡通/漫画使用一个命名空间,因为有很多)。

请注意,奇迹团队和pacman幽灵可以在同一个文档中多次出现。

我能做到这一点是否明智?我是否必须为值创建外部架构?或者有没有办法使用实体或xml包含?

来解决这个问题

1 个答案:

答案 0 :(得分:1)

如果使用XML Schema,最好使用第二种标记(<marvel-team>...)。只有RelaxNG允许给定特定属性值的验证机制。 对于您对外部文档的关注,也许您可​​以考虑XML Schema中的包含机制:

<?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