【问题标题】:XSD restriction for a nested ComplexType element to enable schema validation用于启用架构验证的嵌套 ComplexType 元素的 XSD 限制
【发布时间】:2014-08-07 17:59:21
【问题描述】:

我有两种请求类型,它们在内部使用相同的 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>

BIOrder 是一个 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 中实现这一点。

提前感谢您的帮助。

【问题讨论】:

  • 您说该类型的两种用途仅通过id 属性来区分,但您的描述另有说明:它们还通过bip:BIOrder 的父元素的元素名称来区分。 (短版:你违反了 DRY 原则,宇宙会惩罚你。)
  • 我只提到了类型。尽管两个请求都遵循具有相同根元素(不包括请求包装器)的相同模式,但它们还有许多其他元素不同。但我的意图是根据类型 id 对它们进行架构验证,我目前正在明确地这样做。
  • 你解决了这个问题吗?如果是,你是怎么解决的?
  • 还没有。仍在寻找解决方案。

标签: xml validation xslt jaxb xsd


【解决方案1】:

你不会喜欢这个,但是:

这是根据您的元素 &lt;BIPSearchType&gt; 的类型的 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 的构面定义另一种类型。

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

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

【讨论】:

  • 感谢您的想法。不幸的是,我无法更改元素或将其替换为另一个元素。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 2012-06-24
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多