XSD 根据类型属性验证列表项

XSD validation of list items based on type attribute

假设我有这个 XML:

<list>
  <item id="red" type="colors"/>
  <item id="green" type="colors"/>
  <item id="dog" type="pets"/>
  <item id="blue" type="pets"/> <!-- invalid because blue is not pets -->
  <item id="cat" type="pets"/>
</list>

<enumeration name="colors">
  <items>
     <item value="red"/>
     <item value="blue"/>
     <item value="green"/>
   <items>
</enumeration>

<enumeration name="pets">
  <items>
   <item value="dog"/>
   <item value="cat"/>
   <item value="chicken"/>
  </items>
</enumeration>

如何编写约束条件 (XSD 1.0) 使上面标记为无效的项目失败?我坚持如何创建参考并根据 type 属性的值在该参考中提供特定集合的名称(颜色或宠物)?

选项 1

使用 Conditional Type Assignment 其中 item 是根据其 @type 属性键入的。这需要 XSD 1.1.

示例:参见

选项 2

重新设计您的 XML,将通用 item 名称替换为实际传达元素类型的名称:colorpet:

<list>
  <color id="red"/>
  <color id="green"/>
  <pet id="dog"/>
  <pet id="blue"/>
  <pet id="cat"/>
</list>

然后,为您的 XML 编写一个 XSD 将是微不足道的,您可以在 XSD 1.0 中这样做。