繁体   English   中英

共现约束

[英]Co-Occurrence Constraint

我在编写使用XML Schema 1.1的XSD时遇到困难。

我有一个名为PaymentMethod的元素,它是“ C”或“ F”:如果PaymentMethod =“ C”,则为支票。 如果PaymentMethod =“ F”,则为资金转帐。

如何使BankingInfo(BankName,TransitNo,AccountNo,AccountType)对于支票是可选的,对于资金转账是必选的?

请参阅下面的代码片段。


<xs:element name="PaymentMethod">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="C" />
      <xs:enumeration value="F" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>

    <xs:complexType name="BankingInfo" minOccurs="0">
      <xs:sequence>
        <xs:element name="TransitNo" type="xs:string" />
        <xs:element name="AccountNo" type="xs:string" />
        <xs:element name="AccountType">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="CHK" />
              <xs:enumeration value="SAV" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="BankName" type="xs:string" />
      </xs:sequence>
    </xs:complexType>

您将需要在与BankingInfo节点相同的级别上添加一个断言,因为断言适用于同一级别或更低的级别,但无法向上导航到父级别。 断言测试应检查帐户类型的值,并确保要“必需”的字段实际具有值。

要么

<xs:assert test="/root/PaymentMethod eq 'C' or (/root/PaymentMethod eq 'F' and count(/root/BankingInfo) > 0)"/>

或者,如果您需要一些银行信息,但不要求所有字段,可以执行以下操作

<xs:assert test="/root/PaymentMethod eq 'C' or (/root/PaymentMethod eq 'F' and string-length(/root/BankingInfo/TransitNo) > 0 and string-length(/root/BankingInfo/AccountNo) > 0)"/>

上面的两个方法都假定与下面的结构类似(所提供的部分还不够完整,无法将assert置于正确的级别)

<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="PaymentMethod">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="C"/>
                        <xs:enumeration value="F"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="BankingInfo" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="TransitNo" type="xs:string"/>
                        <xs:element name="AccountNo" type="xs:string"/>
                        <xs:element name="AccountType">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="CHK"/>
                                    <xs:enumeration value="SAV"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="BankName" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:assert test="/root/PaymentMethod eq 'C' or (/root/PaymentMethod eq 'F' and count(/root/BankingInfo) > 0)"/>
    </xs:complexType>
</xs:element>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM