我认为我需要做的是 XSD 1.0 不可能,但无论如何我会问......我有complexType
一个文件,比如说a.xsd
. 原则上,我不能碰这个文件。特别是,我无法更改其targetNamespace
. 一个例子是:
<xs:schema targetNamespace="http://myns.original"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:orig="http://myns.original">
<xs:element name="config" type="orig:ConfigType"/>
<xs:complexType name="ConfigType">
<xs:sequence>
<xs:element name="fieldA" type="xs:integer" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我有第二个文件 ,b.xsd
在其中我扩展了 中定义的类型a.xsd
,并使用 重新定义了之前定义的a.xsd
元素substitutionGroup
。现在一切都很好,下面的例子似乎没问题:
<xs:schema targetNamespace="http://myns.myns"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:myns="http://myns.myns" xmlns:orig="http://myns.original">
<xs:import namespace="http://myns.original" schemaLocation="a.xsd"/>
<xs:complexType name="ConfigType">
<xs:complexContent>
<xs:extension base="orig:ConfigType">
<xs:sequence>
<xs:element name="fieldB" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="config" type="myns:ConfigType" substitutionGroup="orig:config"/>
</xs:schema>
问题来了:原来的一个字段complexType
是可选的(minOccurs=0
)。现在,我需要重新定义此类型,以便该字段是必需的 ( minOccurs=1
)。我猜想这可以通过 来实现xsd:redefine
,所以我尝试了以下方法:
<xs:schema targetNamespace="http://myns.myns"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:myns="http://myns.myns">
<xs:redefine schemaLocation="b.xsd">
<xs:complexType name="ConfigType">
<xs:complexContent>
<xs:restriction base="myns:ConfigType">
<xs:sequence>
<xs:element name="fieldA" minOccurs="1"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
</xs:schema>
但我收到以下消息:
There is not a complete functional mapping between the particles.
Error for type 'ConfigType'. The particle of the type is not a valid restriction of the particle of the base.
老实说,我不太了解这些消息,但经过一番调查,似乎实际问题是重新定义的字段必须与重新定义属于同一个命名空间。在我的情况下,我尝试将字段限制orig:fieldA
在命名空间内http://myns.original
,在 targetNamespace="http://myns.myns" 的文件中。当然,如果c.xsd
像我在中那样继续扩展类型b.xsd
,那没有问题,因为我不会尝试从不同的命名空间修改任何内容。
有谁知道这是否可以实现?一种解决方案是将要修改的定义复制到不同的文件中a_2.xsd
,并使用targetNamespace
. 但对于复杂系统来说,这是一个非常不受欢迎且不可维护的解决方案。