在XML模式中表达“必须存在”的关系

时间:2016-11-22 09:21:03

标签: xml xpath xsd schema

我有一个XML文档(最低可重现性示例),如下所示:

<root start="baz">
    <child name="foo">...</child>
    <child name="bar">...</child>
    <child name="baz">...</child>
</root>

我希望我的架构强制执行以下事实:根元素上的start属性必须引用具有该名称的现有child节点。如果没有具有该值的name属性的子节点,则验证将失败。换句话说,上面应该验证,但这应该

<root start="baz">
    <child name="foo">...</child>
    <child name="bar">...</child>
</root>

这样做的好方法是什么?我是否真的需要使用具有合适XPath表达式的assert,还是有更自然的方式在XSD中表达这一点?感谢。

PS:假设start是必需属性,而子name属性在适当的范围内标记为唯一。

1 个答案:

答案 0 :(得分:1)

您正在寻找xsd:key / xsd:keyref。参见:

  

XML Schema key/keyref - how to use them?

可能有点喜欢:

<xsd:key name="root-child-name"> 
  <xsd:selector xpath="root/child"/> 
  <xsd:field xpath="@name"/> 
</xsd:key> 
<xsd:keyref name="root-start" refer="root-child-name"> 
  <xsd:selector xpath="root"/> 
  <xsd:field xpath="@start"/> 
</xsd:keyref>