在XSD元素上,我可以根据祖父节点的属性值设置maxOccurs吗?

时间:2011-09-16 03:53:05

标签: xml validation xsd

我想使用单个XSD定义下面的两个xml结构。

<grandparent action="SUBMIT">
   <parent>
       <child value="blah"/>
   </parent>
<grandparent>

<grandparent action="CANCEL">
   <parent>
   </parent>
<grandparent>

我想强制执行的规则:

  • 如果action等于“SUBMIT”,则<child>的maxOccurs应该是无界的
  • 如果action等于“CANCEL”,<child>的maxOccurs应为0(即不应出现)

是否可以使用XSD强制执行这些规则?

1 个答案:

答案 0 :(得分:2)

你不能在XSD 1.0中做这种事情 - 但是你可以在XSD 1.1中实现(目前在Saxon和Xerces的最新版本中实现)。有两种可能的方法:

(a)条件类型赋值:祖父母有两种不同的类型,并根据属性值选择要验证的类型

(b)断言:将maxOccurs保留在语法中无限制,并沿着test="if (@ACTION='cancel') then empty(*/child) else true()"

行向祖父母添加断言