我有一个具有本地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。我怎样才能解决这个问题。欢迎任何其他建议。
答案 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中实施。
另一种解决方案是两阶段验证。使用客户端的模式来确保文档符合客户端定义的约束,然后使用您自己的模式(或其他技术)来验证它是否符合您定义的其他约束。无论如何,这可能是一种架构上更清洁的方法。