如何设置key和keyref约束,其中key和keyref元素的名称相同

时间:2015-05-27 08:04:32

标签: xml xsd

我希望在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>

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

对于我的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时,“...具有引用范围之外的Key或唯一的Keyref”会抛出,或者无论使用哪种ID,都不会抛出任何错误。无论哪种方式,我都没有设法让这个XSD在任何验证器中成功验证,因此我用于密钥和keyref的选择器必须是错误的。

有人能发现我出错的地方吗?

1 个答案:

答案 0 :(得分:0)

尝试使用以下内容:

<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>