使用递归模式定义执行XSD键和keyref约束效果不佳

时间:2015-01-22 15:21:37

标签: xml xsd key recursive-datastructures keyref

我正在尝试使用XSD的<xs:key><xs:keyref>元素来强制执行自定义XML格式的键和引用约束。它没有像我希望的那样工作。

首先是我的XML格式的示例实例:

<room xmlns="http://example.com">
  <box>
    <item name="x" uses="y" />
    <item name="y" uses="z" />
    <item name="z" />
    <box>
      <item name="p" uses="q" />
      <item name="q" uses="r" />
      <item name="r" />
      <box>
      </box>
    </box>
  </box>
</room>

此数据结构描述了一个“房间”,其中包含一个“框”。一个盒子可以包含物品和其他盒子。一个盒子也可以是空的。框中的项目必须具有不同的名称(但可以与其他框中的项共享名称),并且只能“使用”同一框中的其他项目。

我试图通过在适当的属性上使用key / keyrefs来保持“使用”图的完整性。但是,当我使用下面的架构在此XML上使用Xerces 2验证器时,我收到以下错误:

[Error] file:///example.xml:13:11: cvc-identity-constraint.4.3: Key 'ItemKeyRef' with value 'q' not found for identity constraint of element 'box'.
[Error] file:///example.xml:14:9: cvc-identity-constraint.4.3: Key 'ItemKeyRef' with value 'y' not found for identity constraint of element 'box'.

架构:

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:example="http://example.com"
  targetNamespace="http://example.com"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">

  <xs:element name="room" type="example:Room" />

  <xs:complexType name="Room">
    <xs:all>
      <xs:element ref="example:box" />
    </xs:all>
  </xs:complexType>

  <xs:element name="box" type="example:Box">
    <xs:keyref name="ItemKeyRef" refer="example:ItemKey">
      <xs:selector xpath="./example:item" />
      <xs:field xpath="@uses" />
    </xs:keyref>
    <xs:key name="ItemKey">
      <xs:selector xpath="./example:item" />
      <xs:field xpath="@name" />
    </xs:key>
  </xs:element>

  <xs:complexType name="Box">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="item" type="example:Item" />
      <xs:element ref="example:box" />
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="Item">
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="uses" type="xs:string" />
  </xs:complexType>
</xs:schema>

我觉得我做错了什么。为什么我收到此错误?这不应该验证吗?

1 个答案:

答案 0 :(得分:1)

我发现我使用的Xerces2 Java Parser 2.11.0在使用递归元素定义和key / keyrefs时包含一些错误。当我尝试使用oXygen XML Developer验证上述XML时,它成功了,这使我相信Apache's issue tracker的错误报告是准确的。