我正在创建一个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包含?
来解决这个问题答案 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
。