是否可以在XSD中将一个属性与另一个属性相关联



我可以让c_id引用<customers>ac_id引用<accounts>吗?这意味着限制<savings_account>c_idid的范围,以及<checking_account>ac_idid的范围?

<?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_accountc_id属性。

第二个

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

断言每个<savings_account>id属性都包含为<customer_accountac_id属性。

第三个

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

断言每个<checking_account>id属性都包含为<customer_accountac_id属性。

所以是的,是可能的

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

最新更新