【问题标题】:How to set up a key/keyref constraint where the key and keyref elements are named the same如何设置 key/keyref 约束,其中 key 和 keyref 元素命名相同
【发布时间】:2015-05-27 08:04:31
【问题描述】:

我正在寻找在 XPath 1.0 中创建键和 keyref 之间的约束的方法。

假设我有一个这样的 XML 文档 -

<?xml version="1.0" encoding="utf-8" ?>

<root xmlns="schema.xsd">

  <items>
    <item id="1"/>
    <item id="2"/>
    <item id="3"/>
  </items>

  <group>
    <items>
      <item ref="2"/>
    </items>
  </group>

</root>

我需要确保“组”下列出的所有项目都引用根/项目列表中的项目。

对于我的 XSD,我尝试了多种不同的方法,但都没有奏效。

例如,

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="schema.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="schema.xsd" elementFormDefault="qualified"
           id="schema">

  <xs:element name="root">

    <xs:complexType>
      <xs:sequence> 

        <xs:element name="items">
          <xs:complexType>
            <xs:sequence maxOccurs="unbounded">

              <xs:element name="item">
                <xs:complexType>
                  <xs:attribute name="id"/>
                </xs:complexType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element> 

        <xs:element name="group" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>

              <xs:element name="items">
                <xs:complexType>
                  <xs:sequence maxOccurs="unbounded">

                    <xs:element name="item">
                      <xs:complexType>
                        <xs:attribute name="ref"/>
                      </xs:complexType>                          
                    </xs:element>

                  </xs:sequence>
                </xs:complexType>
                <xs:keyref name="itemIdRef" refer="itemId">
                  <xs:selector xpath="item"/>
                  <xs:field xpath="@ref"/>
                </xs:keyref>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>   

      </xs:sequence>    
    </xs:complexType>

    <xs:key name="itemId">
      <xs:selector xpath="./root/items/item"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>

</xs:schema>

根据验证器的不同,当使用存在的 id 时会抛出“...Has A Keyref which References A Key or Unique That Is Out Of Scope”,或者无论使用何种 id 都不会抛出错误。无论哪种方式,我都没有设法让这个 XSD 在任何验证器中成功验证,所以我用于 key 和 keyref 的选择器一定是错误的。

谁能发现我在这方面出了什么问题?

【问题讨论】:

  • 可以在元素项中声明元素键。然后在元素根中定义元素keyref。

标签: xml xsd


【解决方案1】:

尝试使用以下方法:

<xs:schema xmlns:fx="schema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="schema.xsd" elementFormDefault="qualified"
id="schema">

<xs:element name="root">

    <xs:complexType>
        <xs:sequence> 

            <xs:element name="items">
                <xs:complexType>
                    <xs:sequence maxOccurs="unbounded">

                        <xs:element name="item">
                            <xs:complexType>
                                <xs:attribute name="id"/>
                            </xs:complexType>
                        </xs:element>

                    </xs:sequence>

                </xs:complexType>
                <xs:key name="itemId">
                    <xs:selector xpath="fx:item"/>
                    <xs:field xpath="@id"/>
                </xs:key>
            </xs:element> 

            <xs:element name="group" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="items">
                            <xs:complexType>
                                <xs:sequence maxOccurs="unbounded">

                                    <xs:element name="item">
                                        <xs:complexType>
                                            <xs:attribute name="ref"/>
                                        </xs:complexType>                          
                                    </xs:element>

                                </xs:sequence>
                            </xs:complexType>

                        </xs:element>

                    </xs:sequence>
                </xs:complexType>
            </xs:element>   

        </xs:sequence>    
    </xs:complexType>
    <xs:keyref name="itemIdRef" refer="fx:itemId">
        <xs:selector xpath="fx:group/fx:items/fx:item"/>
        <xs:field xpath="@ref"/>
    </xs:keyref>

</xs:element>

【讨论】:

  • 看起来我遇到了同样的验证错误。也许是我正在使用的验证器 - 是否有您使用过的在线验证器可供我检查?
  • 我用的是oXygen XML Editor(试用版)。可以试用30天。
猜你喜欢
  • 2017-06-11
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2013-06-22
  • 2011-05-28
  • 2011-01-02
相关资源
最近更新 更多