我可以让c_id
引用<customers>
,ac_id
引用<accounts>
吗?这意味着限制<savings_account>
的c_id
到id
的范围,以及<checking_account>
的ac_id
到id
的范围?
<?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>
这只能在XSD-1.1中实现。您可以使用如下所示的XSD-1.1文件。它使用三个xsd:assert
来实现所需的限制(或接近您的要求(:
<?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 中将一个属性与另一个属性关联