XML模式两级键/ keyref约束

时间:2015-02-10 07:44:19

标签: xml xsd xsd-validation

给出以下xml:

<root>
  <families>
     <family familyname="Flintstone">
         <member name="Fred"/>
         <member name="Wilma"/>
     </family>
     <family familyname="Rubble">
         <member name="Barney"/>
         <member name="Betty"/>
         <member name="Bamm-Bamm"/>
     </family>
  </families>
  <employees>
     <employee name="Fred" familyname="Flintstone"/>
  <employees>
</root>

是否可以在xsd中构建一个key / keyref约束来验证empployee的有效性?

以下内容不适用于密钥(keyref是直接向前):

<xs:key name="Individuals">
    <xs:selector xpath="./families/family/member"/>
    <xs:field xpath="@name"/>
    <xs:field xpath="../@familyname"/>
</xs:key>

是否有有效的替代方案?

1 个答案:

答案 0 :(得分:0)

不,如上所述,这是不可能的。我认为“有效替代”是实现您的意图的,即使它涉及对XML的更改。

在这种情况下,只需向成员添加新的强制属性(@key作为示例)元素。这意味着您应该从员工中删除name + familyname,然后添加密钥。

它会更像是一个“数据库”......好处:

  • 较小的尺寸
  • 规范化设计
  • key / keyref易于操作
  • 毕竟,familyname + member / @ name可能并不总是唯一的。有了钥匙,你就不会有这个问题了,因为你真正认定一个成员(不是一个人,因为同一个人可能涉及两个不同的家庭,一个是儿子,另一个是丈夫)。

我意识到你的插图是一个真实场景的模型,因此我的最后一个好处可能与你的实际情况无关。不过,这是一种应该适用的思维方式。