有一种方法可以在xsd中创建像'外键限制'这样的规则吗? 我需要检查是否存在一个等于节点属性“use”的属性值。
<node use="..." />
<otherNode name="..." />
请参阅上面的示例,该属性设置为'node'属性'use',此属性的值必须等于'name'属性中的'otherNode'
答案 0 :(得分:1)
将use属性的类型设置为xs:IDREF
和xs:ID的名称属性。
还有一个xs:IDREFS类型。
一个例子
<xsd:element name="quote">
<xsd:complexType>
<!--content model-->
<xsd:attribute name="ref" type="xsd:IDREF"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="footnote">
<xsd:complexType>
<!--content model-->
<xsd:attribute name="id" type="xsd:ID" use="required"/>
</xsd:complexType>
...
给出
<quote ref="fn1">...</quote>
<footnote id="fn1">...</footnote>
所以引用必须有一个ref参数,在这种情况下指向一个脚注
嗯,看来上面是针对DTD而且不起作用,但我发现了这个
真正的密钥表示
如果您曾尝试使用DTD描述具有复杂关系图的关系数据库,则可能不得不使用ID-IDREF指向机制。例如,在两个实体通过相关表(例如贷款申请中的借方和资产)以多对多方式相关的结构中,简单的XML父子关系是不够的。但是,ID和IDREF有其自身的缺点:ID在整个文档中必须是唯一的,并且IDREF声明不指定IDREF属性的实例必须引用的元素类型。 XML Schema提供了一种指定这些指向关系的方法,其方式与在关系数据库中声明外键关系的方式非常相似。例如,假设您有一个外键关系,您无法在我们的XML中使用简单的父子关系来表达。您可以声明清单3中的两个相关元素:
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="integer" />
<xsd:attribute name="elementOneDesc" type="text" />
</xsd:complexType>
<xsd:key name="elementOnePK">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:key>
</xsd:element>
<xsd:element name="elementTwo" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementTwoKey" type="integer" />
<xsd:attribute name="elementOneKey" type="integer" />
<xsd:attribute name="elementTwoDesc" type="text" />
</xsd:complexType>
<xsd:keyref name="elementOneFK" refer="elementOnePK">
<xsd:selector xpath=".//elementTwo"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:keyref>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
哪个更好,因为你可以正确链接id和引用。
加分我正在学习东西。