嵌套ComplexType元素的XSD限制以启用架构验证

时间:2014-08-07 17:59:22

标签: xml validation xslt jaxb 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中实现这一目标。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

你不会喜欢这个,但不过:

这是根据您的元素<BIPSearchType>的类型的XML架构,其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定义。

显然,构建两次上层是绝对没有吸引力的,但是face(例如min / maxInclusive)是类型定义的一部分,并且只要有两种不同的类型,否则相同的类型单个元素与这两个元素的区别也不同。

我想不出比你现在可能使用的更简单的东西。

答案 1 :(得分:2)

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

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

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