我有一个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
属性在适当的范围内标记为唯一。
答案 0 :(得分:1)
您正在寻找xsd:key
/ xsd:keyref
。参见:
可能有点喜欢:
<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>