我正在编写一个xml架构(比方说A),它会导入另一个架构(比方说B)。我有一个复杂的类型(假设它被命名为CT),它列出了在B中定义的元素的序列/选择。我想允许序列/选择中的任何元素,但明确列出其中的一些元素。我怎么做 ? 例如
<xs:schema xmlns:b="http://B" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:a="http://A" targetNamespace="http://A">
<xs:import namespace="http://B"/>
<xs:complexType name="CT">
<xs:sequence minOccurs="0" maxOccurs="unbounded"> <!-- using choice is a possible option -->
<xs:element ref="b:e1" minOccurs="0"/>
<xs:element ref="b:e2" minOccurs="0"/>
<xs:element ref="b:e3" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
此架构的问题在于它不明确。验证没有通过,因为“## other”命名空间允许任何名称空间不同于A =&gt;可以使用B中的元素,但其中一些元素已经在选择/序列中声明,这就是模糊性的来源。
注意:B:e1,B:e2,B:e3的顺序未定义。
有人会问“你为什么要那样做”?
因为我使用JAXB从这个xml架构生成一些类。我知道元素B:e1,B:e2,B:e3很可能会在那里,我有特殊的工作流程(所以我需要每个java对象表示)我真的不需要处理其他可能的元素(但应允许它们)。
注意:我不能使用include而不是import,因为B模式是预定义的并且目标是不同的命名空间。
那么有谁知道如何从## other中排除B? 欢迎任何其他解决方案。
谢谢。
答案 0 :(得分:1)
这在XSD 1.1中很简单,因为在1.1中,当通配符与xsd:element元素竞争时,xsd:element元素获胜。 (在1.0中,您所说明的模式违反了“唯一粒子归因”[即确定性]规则。)
目前XSD 1.1支持(按字母顺序排列)Altova,Saxon和Xerces。