XSD:如何限制多个相关的值?

时间:2011-03-04 02:20:42

标签: xml xsd enumeration

我有一个XML元素,比如<fruit>,它受枚举限制,因此它只能取值:apple, orange, watermelon

我还有另一个字段,该字段也应该受到具有以下值的枚举的限制:red, orange, green

有没有办法以某种方式关联这两个元素,以便唯一可能的组合:apple-red, orange-orange, watermelon-green?我试图在复杂类型中找到某种枚举,但似乎XSD不支持它们。

2 个答案:

答案 0 :(得分:1)

在XSL Schema中没有可能做到这一点。

有两种方法可以达到你想要的效果:

如果你真的必须坚持使用XSD-Schema:

  • 使用Schematron转换并定义这些规则

如果你的环境没有被迫使用XSD-Schema

  • 你应该使用放松NG

在Relax NG中,您有更多可能表达复杂的行为。最重要的是,它比XSD Schema更容易编写和理解。

在Relax NG中你想表达的内容会是这样的(你可以在选择中定义你的元素3次)

<choice>
 <element name="fruit-combination">
  <element name="fruit">
   <value>apple</value>
  <element>
  <element name="colour">
   <value>red</value>
  </element>
 </element>
 <element name="fruit-combination">
  <element name="fruit">
   <value>orange</value>
  <element>
  <element name="colour">
   <value>orange</value>
  </element>
 </element>
 <element name="fruit-combination">
  <element name="fruit">
   <value>watermelon</value>
  <element>
  <element name="colour">
   <value>green</value>
  </element>
 </element>
</choice>

然后,Relax NG实施将为您选择合适的元素。如果您正在使用一个好的xml编辑器,并且将Apple元素放在文件中,它甚至会限制您,以便您只能添加值为红色的颜色元素,等等。

在Schematron中,你只需为你的颜色元素编写一个规则,红色值只有在其中有一个带有值apple的水果元素时才有效。 Schematron本身只是一个特殊的XSL-Transformation,它将一些规则应用于xml文档,并以XML形式输出错误和警告的报告。

请参阅:

http://relaxng.org/ http://www.schematron.com/(规格) http://www.schematron.com/implementation.html(实施)

答案 1 :(得分:0)

这是XSD 1.0中众所周知的限制,它通过断言和/或条件类型分配机制在XSD 1.1中修复。

XSD 1.1目前在Saxon-EE和Apache Xerces中实现。