xml - 是否可以将一个属性与 XSD 中的另一个属性相关联?
问题描述
我c_id
可以引用<customers>
和ac_id
引用<accounts>
,这意味着限制c_id
to id
of<savings_account>
和ac_id
to id
of的范围<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
s 来实现所需的限制(或有点接近您的要求):
<?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 中将一个属性关联到另一个属性
推荐阅读
- asp.net-core - 从日期时间输入中删除时间
- ruby - 打印哈希数组
- vim - 仅替换插入模式中的更改
- java - 如何暂停@test 的执行直到@BeforeSuit 的执行?
- c# - 为什么带有 SAML 前缀的 XPATH 可以获得 SAML2 前缀元素?
- java - Java - 在运行时创建泛型类类型
- javascript - 如何使用 javascript 在 fullcalendar 中更新事件详细信息?
- excel - 如何用Excel写一个月的工作日?
- android - 我无法从数组列表中删除项目。如何从android中的数组列表中删除项目?
- git - 从 git 历史记录中永久删除文件