XSD对本地complexType元素的限制

时间:2013-10-03 23:58:41

标签: xml xsd restriction complextype

我有一个具有本地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。我怎样才能解决这个问题。欢迎任何其他建议。

2 个答案:

答案 0 :(得分: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以取消本地complexType,您可以做什么?根据您的要求,也许您可​​以使用AddressType扩展xs:extension并根据需要定义自己的MyLocation元素,忽略原始Location元素(或从不创建它 - 这是可选的)。或者,也许完全解耦的InternalAddressType定义适合您。如果这些可能性都不能满足您的目的,请在评论中说明您最终目标的要求,也许我们可以找到适当的接近。

答案 1 :(得分:0)

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

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

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