对嵌套的ComplexType元素的XSD限制,以启用模式验证



我有两个内部使用相同的compleType元素的请求类型。两个请求之间的区别因素是元素属性值(与请求包装器无关)。需要在XSD中添加此条件以将其用作模式验证的一部分。

下面是元素声明示例

<xsd:element name="searchRequest" type="searchRequest_Type"/>
<xsd:complexType name="searchRequest_Type">
    <xsd:sequence>
         <xsd:element ref="bip:BIPOrder" minOccurs="1">                 
         </xsd:element>
    </xsd:sequence>
</xsd:complexType>

<xsd:element name="advanceSearchRequest" type="advanceSearchRequest_Type"/>
<xsd:complexType name="advanceSearchRequest_Type">
    <xsd:sequence>
         <xsd:element ref="bip:BIPOrder" minOccurs="1">                 
         </xsd:element>
    </xsd:sequence>
</xsd:complexType>

BIPOrder是一个包含许多其他嵌套的complexType元素的complexType。其中一个complexType中的Element属性值是上述两个请求之间的区别因素。

<myap:searchRequest>
    <bip:BIPOrder>
        <....>
            <....>
            <BIPSearchType id="459">Normal Search</BIPSearchType>
            <....>
    </bip:BIPOrder>
</myap:searchRequest>
<myap:advanceSearchRequest>
    <bip:BIPOrder>
        <....>
            <....>
            <BIPSearchType id="479">Advanced Search</BIPSearchType>
            <...>           
    </bip:BIPOrder>
</myap:advanceSearchRequest>

我希望在我的XSD中添加对BIPSearchType"id"属性值的限制,以便在验证请求XML时它也应该满足此条件。

目前我能够通过XSD验证整个请求,除了这个条件。我在模式验证之后显式地验证此条件,以检查"BIPSearchType"id"是否与请求一起发送。

请告诉我如何在我的XSD中实现这一点。

提前感谢您的帮助。

你可能不喜欢这样,但是:

这是一个类型的XML Schema,根据你的元素<BIPSearchType>, id限制为459。

<xs:complexType name="BIPSearchTypeType459">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attribute name="id">
        <xs:simpleType>
          <xs:restriction base='xs:int'>
            <xs:minInclusive value='459'/>
            <xs:maxInclusive value='459'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

另一个类型可以用479的facet来定义。

显然,构造两次上层绝对没有吸引力,但是facet(例如min/maxInclusive)是类型定义的一部分,并且一旦存在两个不同的类型,那么单个元素中与这两个不同的相同类型也是不同的。

我想不出还有什么比你现在用的更简单的了

您应该添加一个XSD元素依赖限制。如果您只使用XSD 1.0,那么这是不可能的。如果您愿意将XSD 1.0处理器与Schematron引擎结合起来,那么您可以这样做。

无论如何,如果您可以访问XSD 1.1处理器,那么您可以使用<xsd:assert/>来解决它,或者您可以使用类型替代。查看此处获取更多信息。

我希望这是你正在寻找的:)

最新更新