Xml 根据元素值在XSD中更改类型?

Xml 根据元素值在XSD中更改类型?,xml,xsd,xsd-validation,xml-validation,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. B 我希望构

我有以下两个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.
B
我希望构建一个模式来验证如果元素类型的值为“a”,那么它的子元素(aka
p1
&
p2
)应该为零或空。
而当元素类型为其他类型时,例如“b”,则
p1
p2
元素可以包含任何内容,也可以不包含任何内容。

您的XML设计不理想

如果要进一步约束元素的内容,则不应将其命名为
struct

而不是

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

A.
使用

)介绍如何编写基于另一个元素的值限制一个或多个元素的断言

另请参见:


这是“共现约束”(一个元素的类型取决于另一个元素的值)的经典示例。这不能用XSD1.0实现,但可以通过断言使用XSD1.1实现

<xs:assert test="if (type eq 'a') then nilled(p1) else true()"/> 

<xs:assert test="if (type eq 'a') then nilled(p1) else true()"/>