4

我认为我需要做的是 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. 但对于复杂系统来说,这是一个非常不受欢迎且不可维护的解决方案。

4

1 回答 1

2

到目前为止,我看到的唯一问题是在a.xsd您定义的架构中:

<xs:element name="fieldA" type="xs:integer" minOccurs="0"/>

而在最后一个模式(重新定义)中,您有:

<xs:element name="fieldA" minOccurs="1"/>

最后一个声明的实际含义是您隐式xs:anyType指定fieldA

<xs:element name="fieldA" type="xs:anyType" minOccurs="1"/>

请记住,当您通过限制派生新类型时(这实际上是您在重新定义中所做的),您必须重新定义元素内容模型。但新的内容模型必须完全符合旧的内容模型。

在您的最后一个模式中情况并非如此,因为之前根据a.xsd,该元素fieldA只允许具有整数值。但是现在,你说它可以接受任何东西。这肯定会导致错误,并且您收到的消息(尽管确实是胡言乱语):

类型的粒子不是基粒子的有效限制。

似乎正是在说这个。

于 2013-06-27T13:16:52.847 回答