1

我有一个具有本地 complexType 元素的架构,如下所示。

<xs:complexType name="AddressType">
    <xs:sequence>
        <xs:element name="Line1" type="xs:string" minOccurs="0"/> 
        <xs:element name="Line2" type="xs:string" minOccurs="0" maxOccurs="100"/>
        <xs:element name="Location" minOccurs="0" maxOccurs="100">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="XCoordinate" type="xs:decimal" minOccurs="0"/>
                    <xs:element name="YCoordinate" type="xs:decimal" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence> 
</xs:complexType>

我正在尝试将这个 complexType 扩展如下

<xs:complexType name="InternalAddressType">
    <xs:complexContent>
        <xs:restriction base="AddressType">
            <xs:sequence>
                <xs:element name="Location" >
                </xs:element>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

我收到以下错误

**Error for type 'InternalAddressType'.  The particle of the type is not a valid restriction of the particle of the base.

谁能帮我理解我在做什么?似乎问题在于 Location 是本地的 ComplexType。但我无法改变这一点,因为我从客户端获取 xsd 并且只需要扩展 Loaction。我该如何解决这种情况。欢迎任何其他建议。

4

2 回答 2

0

你是对的:你不能限制Location,因为它是由本地定义的complexType

即使restriction其中AddressType包含完全相同的组件也会同样失败:

  <xs:complexType name="InternalAddressType">
    <xs:complexContent>
        <xs:restriction base="AddressType">
          <xs:sequence>
            <xs:element name="Line1" type="xs:string" minOccurs="0"/> 
            <xs:element name="Line2" type="xs:string" minOccurs="0" maxOccurs="100"/>
            <xs:element name="Location" minOccurs="0" maxOccurs="100">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="XCoordinate" type="xs:decimal" minOccurs="0"/>
                  <xs:element name="YCoordinate" type="xs:decimal" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

如果不尝试覆盖Location,上面的定义就可以了。

鉴于您无法更改AddressType以拉出 local complexType,您能做什么?根据您的要求,也许您可​​以扩展AddressType使用xs:extension并定义您自己的MyLocation元素,如您所愿,忽略原始Location元素(或从不创建它 - 它是可选的)。或者,也许 InternalAddressType 的完全解耦定义对您有用。如果这些可能性都不能满足您的目的,请在评论中说明您最终目标的要求,也许我们可以找到合适的东西。

于 2013-10-04T04:14:42.267 回答
0

如果您能够使用 XSD 1.1(遗憾的是,使用的人并不多),那么您可以以断言的形式定义您的限制 - 因为它准确地说明了您想要应用的附加条件,所以这是一种更有用的机制,在我看来,而不是提供必须与原始内容保持密切对应的替代内容模型。

XSD 1.1 目前在 Saxon 和 Xerces 中实现。

另一种解决方案是两阶段验证。使用客户端的架构来确保文档符合客户端定义的约束,然后使用您自己的架构(或其他技术)来验证它是否符合您定义的附加约束。无论如何,这很可能是一种架构上更清洁的方法。

于 2013-10-04T07:01:15.147 回答