我在编写XSD时遇到困难我正在使用XML Schema 1.1。
我有一个名为PaymentMethod的元素是“C”或“F”: 如果PaymentMethod =“C”,那么这是一个检查。 如果PaymentMethod =“F”,那么它就是资金转移。
如何将银行信息(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>
答案 0 :(得分:0)
您需要在与BankingInfo节点相同的级别添加断言,因为断言适用于相同级别或更低级别,但无法导航到父级别。断言测试应该检查帐户类型的值,并确保您希望的字段是&#34; required&#34;实际上有价值观。
无论
<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)"/>
以上两者都假设了一些类似于下面的结构(提供的部分并不是一个完整的示例,可以将断言置于正确的级别)
<?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>