2011-11-23 37 views
1

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

我的主要目的是使用XML精通工具(最好是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> 

当然的标记是可以改变的,并命名空间可以作为很好(虽然我宁可不使用每漫画/连环画一个命名空间有很多)。

请注意,marvel团队和pacman鬼魂可以在同一个文档中多次出现。

有没有一种明智的方法可以做到这一点?我是否必须为值创建外部模式?或者有没有办法解决这个使用实体或XML包括?

回答

1

如果使用XML Schema,则最好使用第二种标记(<marvel-team>...)。只有RelaxNG允许给定特定属性值的这种验证机制。 你对外部文件的关注,也许是你可以考虑包括XML架构机制:

<?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有当您添加更改或删除元素。

+0

感谢您指点我RelaxNG,我会看看那个。关于你的建议:那么我会动态地创建一个包含原始模式的模式?有趣的是,我会考虑这一点。但问题是:我希望生成基于原始模式(例如通过JAXB)的工具来处理XML。 –

+0

一种选择是:1)放松第一个提议的NG模式。 2)使用Relax NG工具的XML版本3)使用Trang将RelaxNG转换为XSD。 4)放宽XSD,以便每个ref属性都是xs:string。 5)确保收到的XML在编组之前根据Relax NG模式(使用Jing)进行控制。那么你没有更多的控制要做,数据是正确的,这要感谢RelaxNG Schema。 6)当你有变化时,只需改变Relax NG(你可以使用与我上面的回答相同的包含机制)。 –