如何在复杂类型中允许任何类型的元素,不包括导入模式中的类型/元素

时间:2014-02-28 08:43:35

标签: java jaxb xsd

我正在编写一个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? 欢迎任何其他解决方案。

谢谢。

1 个答案:

答案 0 :(得分:1)

这在XSD 1.1中很简单,因为在1.1中,当通配符与xsd:element元素竞争时,xsd:element元素获胜。 (在1.0中,您所说明的模式违反了“唯一粒子归因”[即确定性]规则。)

目前XSD 1.1支持(按字母顺序排列)Altova,Saxon和Xerces。