Xml 共现约束

Xml 共现约束,xml,xsd,xsd-1.1,Xml,Xsd,Xsd 1.1,我在使用XMLSchema1.1编写XSD时遇到了困难 我有一个名为PaymentMethod的元素,它是“C”或“F”: 如果PaymentMethod=“C”,那么这是一张支票。 如果PaymentMethod=“F”,则是资金转账 如何使BankingInfo(银行名称、TransitNo、AccountNo、AccountType)对于支票是可选的,对于资金转账是强制性的 请参阅下面的代码片段 您需要在BankinInfo节点的同一级别添加断言,因为断言应用于同一级别或更低级别,但无法

我在使用XMLSchema1.1编写XSD时遇到了困难

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

如何使BankingInfo(银行名称、TransitNo、AccountNo、AccountType)对于支票是可选的,对于资金转账是强制性的

请参阅下面的代码片段



您需要在BankinInfo节点的同一级别添加断言,因为断言应用于同一级别或更低级别,但无法向上导航到父级。assert测试应该检查account type的值,并确保您希望“必需”的字段实际具有值

或者

<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)"/>

以上两种假设的结构与下面的类似(提供的部分不是一个完整的示例,无法将断言放在正确的级别)



@PetruGardea:我的印象是,一些重新开放的评论者并没有阅读所有关于重新开放问题的评论。用明确的信息编辑文本,说明为什么这是不同的,这会有帮助,因为这样的更改对审阅者来说更为突出。@Anthon,我从表面上看你的评论,因为我真的不知道重新打开审阅者的角色是什么。最初,我在meta上查看了关于重新开放的评论,我想把我的推理放在这里——不存在,正如在那里解释的那样。。。问题是,在我看来,这个问题没有什么比Glenn已经提出的内容更重要的了:他想要一个针对共同约束的XSD1.1解决方案。链接到一个说这是不可能的答案只是一个严重误解的例子。@Glenn和元素有什么关系?您是否错过了添加内容?
<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>