根据元素值在XSD中变化类型?

时间:2018-08-29 12:06:14

标签: xml xsd xsd-validation xml-validation

我有以下两个XML文档:

<struct>
<type>a</type>
<p1 xsi:nil="true"/>
<p2 xsi:nil="true"/>
</struct>

<struct>
<type>b</type>
<p1 xsi:nil="true"/>
<p2 xsi:nil="true"/>
</struct>

我希望构建一个架构,以验证元素类型的值为“ a”时,子元素(又名p1p2)应为nil或为空。 而当元素类型是其他类型(例如“ b”)时,则p1p2元素可以包含任何内容或不包含任何内容。

2 个答案:

答案 0 :(得分:1)

这是“共现约束”的经典示例(一个元素的类型取决于另一个元素的值)。 XSD 1.0不能做到这一点,但是XSD 1.1可以通过断言来做到这一点

i

答案 1 :(得分:0)

您的XML设计不理想。

如果您想进一步限制元素的内容,则不应将其命名为struct

代替

<struct>
  <type>a</type>
  <p1/>
  <p2/>
</struct>

使用

<a>
  <p1/>
  <p2/>
</a>

您编写XSD不会有任何问题。

如果坚持使用前一种形式,则必须使用XSD 1.1的断言功能。您可以在此站点(甚至是within an answer just added to this question)上找到许多示例,这些示例说明如何编写断言来基于另一个元素的值来限制一个或多个元素。

另请参见: