首页 > 解决方案 > 是否可以将一个属性与 XSD 中的另一个属性相关联?

问题描述

c_id可以引用<customers>ac_id引用<accounts>,这意味着限制c_idto idof<savings_account>ac_idto idof的范围<checking_account>吗?

<?xml version="1.0" encoding="UTF-8"?>
<bank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="bank.xsd">
    <accounts>
        <savings_accounts>
            <savings_account id="a1" interest="0.03">
                <balance>2500</balance>
            </savings_account>
            <savings_account id="a2" interest="0.03">
                <balance>15075</balance>
            </savings_account>
        </savings_accounts>

        <checking_accounts>
            <checking_account id="a3" >
                <balance>4025</balance>
            </checking_account>
            <checking_account id="a4">
                <balance>-125</balance>
            </checking_account>
            <checking_account id="a5">
                <balance>325</balance>
            </checking_account>
        </checking_accounts>
    </accounts>
    <customers>
        <customer id="c1">
            <name>Ben Richerdson</name>
            <address>Park Drive 2</address>
        </customer>
        <customer id="c2">
            <name>Marc Wretcher</name>
            <address>Mill Drive 75</address>
        </customer>
        <customer id="c3">
            <name>Angel Steady</name>
            <address>Lake Sight 15</address>
        </customer>
    </customers>
    <customer_accounts>
        <customer_account c_id="c1" ac_id="a2"/>
        <customer_account c_id="c1" ac_id="a3"/>
        <customer_account c_id="c2" ac_id="a4"/>
        <customer_account c_id="c3" ac_id="a1"/>
        <customer_account c_id="c3" ac_id="a5"/>
    </customer_accounts>
</bank>

标签: xmlxsd

解决方案


这只能在 XSD-1.1 中实现。您可以使用如下所示的 XSD-1.1 文件。它使用三个xsd:asserts 来实现所需的限制(或有点接近您的要求):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="bank">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="accounts" />          
                <xs:element ref="customers" />          
                <xs:element ref="customer_accounts" />    
            </xs:sequence>
            <xs:assert test="every $c in customers/customer satisfies $c/@id = customer_accounts/customer_account/@c_id" />
            <xs:assert test="every $a in accounts/savings_accounts/savings_account  satisfies $a/@id = customer_accounts/customer_account/@ac_id" /> 
            <xs:assert test="every $a2 in accounts/checking_accounts/checking_account  satisfies $a2/@id = customer_accounts/customer_account/@ac_id" />
        </xs:complexType>
    </xs:element>
          
    <xs:element name="accounts">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="savings_accounts" />          
                <xs:element ref="checking_accounts" />          
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="savings_accounts">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="savings_account">
                <xs:complexType>
                    <xs:sequence>
                    <xs:element name="balance" type="xs:unsignedShort" />
                    </xs:sequence>
                    <xs:attribute name="id" type="xs:string" use="required" />
                    <xs:attribute name="interest" type="xs:decimal" use="required" />
                </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
        
    <xs:element name="checking_accounts">
        <xs:complexType>
            <xs:sequence>
            <xs:element maxOccurs="unbounded" name="checking_account">
                <xs:complexType>
                <xs:sequence>
                    <xs:element name="balance" type="xs:short" />
                </xs:sequence>
                <xs:attribute name="id" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
                            
    <xs:element name="customers">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="customer">
                    <xs:complexType>
                        <xs:sequence>
                        <xs:element name="name" type="xs:string" />
                        <xs:element name="address" type="xs:string" />
                        </xs:sequence>
                        <xs:attribute name="id" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="customer_accounts">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="customer_account">
                    <xs:complexType>
                        <xs:attribute name="c_id" type="xs:string" use="required" />
                        <xs:attribute name="ac_id" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
</xs:schema>

第一个

every $c in customers/customer satisfies $c/@id = customer_accounts/customer_account/@c_id

断言每个<customer>' 的id属性都包含为<customer_account' 的c_id属性。

第二个

every $a in accounts/savings_accounts/savings_account satisfies $a/@id = customer_accounts/customer_account/@ac_id

断言每个<savings_account>' 的id属性都包含为<customer_account' 的ac_id属性。

第三个

every $a2 in accounts/checking_accounts/checking_account  satisfies $a2/@id = customer_accounts/customer_account/@ac_id

断言每个<checking_account>' 的id属性都包含为<customer_account' 的ac_id属性。

所以是的,有可能

在 XSD 中将一个属性关联到另一个属性


推荐阅读