XSD 按名称或备用属性定义元素

XSD define element by name or alternate attribute

考虑 "tag group":

的两种可能实现

允许作者使用名为 <tag-group> 的元素或任何具有属性 role="tag-group".

的元素

我想编写一个 XSD 模式来验证这两种情况。

理想情况下,该架构还可以验证 children 在给定的 parent 中是否有效。例如,"tag group" 允许 children 是名为 <tag> 的元素或任何具有属性 role="tag".

的元素

所以理想的模式会验证,给定 <tag-group>,child 应该是 <tag>;或者给定带有 role="tag-group" 的任何元素,child 应该是带有 role="tag".

的任何元素

测试用例期望:

通过

<tag-group>
  <tag>foo</tag>
</tag-group>

通过

<foo role="tag-group">
  <bar role="tag">fum</bar>
</foo>

失败

<tag-group>
  <bar role="tag">fum</bar>
</tag-group>

失败

<foo role="tag-group">
  <tag>foo</tag>
</foo>

我是 XSD 的新手,如果您 link 他们很乐意查看参考文档。

你越远离由元素名称定义的类型,你就越会发现自己通常与 XSD 的原则背道而驰。

XSD 1.1 的 Conditional Type Assignment (CTA) 允许内容模型因属性值而异。 XSD 1.1 的断言允许基于数据依赖性的进一步类型变化。您可以尝试为此类附加类型制作断言 "flexibility",但我会提醒您,很快就会出现一个问题,最好重新考虑您的设计。

另请参阅 CTA:

  • XSD 1.1 Conditional Type Assignment <alternative test=""> to check if an element hasn't an attribute set?