XSD受限制的规则

时间:2011-12-14 21:14:45

标签: xml xsd

有一种方法可以在xsd中创建像'外键限制'这样的规则吗? 我需要检查是否存在一个等于节点属性“use”的属性值。

<node use="..." />
<otherNode name="..." />

请参阅上面的示例,该属性设置为'node'属性'use',此属性的值必须等于'name'属性中的'otherNode'

1 个答案:

答案 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和引用。

加分我正在学习东西。