是否可以将一个属性与 XSD 中的另一个属性相关联?
Is it possible to associate an attribute to another one in XSD?
可不可以让c_id
引用<customers>
,ac_id
引用<accounts>
,意思是把c_id
的范围限制在id
] 的 <savings_account>
和 ac_id
到 id
的 <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>
这仅在 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
属性中。
所以是的,可以
associate an attribute to another one in XSD
可不可以让c_id
引用<customers>
,ac_id
引用<accounts>
,意思是把c_id
的范围限制在id
] 的 <savings_account>
和 ac_id
到 id
的 <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>
这仅在 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
属性中。
所以是的,可以
associate an attribute to another one in XSD