key,keyref标记在xsd中

时间:2013-08-20 10:44:28

标签: xml xsd keyref

我有这个xsd

<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
  <xs:element name="foo">
    <xs:complexType>
      <xs:choice>
        <xs:element name="bar" 
                    minOccurs="0" 
                    maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="id" 
                          use="required" 
                          type="xs:string" />
          </xs:complexType>
        </xs:element>
        <xs:element name="batz" 
                    minOccurs="0" 
                    maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="idref" 
                          use="required" 
                          type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:key name="ID">
      <xs:selector xpath="./bar" />
      <xs:field xpath="@id" />
    </xs:key>
    <xs:keyref name="IDREF" refer="ID">
      <xs:selector xpath="./batz" />
      <xs:field xpath="@idref" />
    </xs:keyref>
  </xs:element>
</xs:schema>

我有这两个xml使用这个xsd作为验证:
第一

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  
     xsi:noNamespaceSchemaLocation=
      'file:/home/tareq/NetBeansProjects/HTML5Application/public_html/refTest.xsd'>
    <bar id="1"/>
    <bar id="2"/>
</foo>

第二

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
     xsi:noNamespaceSchemaLocation =
         'file:/home/tareq/NetBeansProjects/HTML5Application/public_html/refTest.xsd'>
    <batz idref="1" /> <!-- this should succeed because <bar id="1"> exists -->
    <batz idref="3" /> <!-- this should FAIL -->
</foo>

验证说错误并且当我用choice标签替换sequence标签并且我用一个xml写两个xml时正常工作。
问题出现在这个xsd中,我的意思是两个xml不能在彼此之间进行ref / keyref 这就是我现在正面临的问题,这就是我3天后想要做的事情。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想使用XSD密钥和keyref检查(a)一个XML文档中的值在该文档中是唯一的(使用xsd:key)和(b)另一个XML文档中的值是仅从第一个文档中给出的值绘制(使用xsd:keyref)。

目标(a)是可以实现的;目标(b)无法通过XSD实现。 XSD的参照完整性约束旨在用于单个XML文档,而不是跨文档边界。要检查跨文档边界的完整性约束,可以使用W3C的服务建模语言(主要用于扩展XSD以及此类的一些跨文档完整性检查)或Schematron。祝你好运。

答案 1 :(得分:-1)

f我理解正确,您希望使用XSD密钥和keyref来检查(a)一个XML文档中的值在该文档中是唯一的(使用xsd:key)和(b)另一个XML文档中的值是仅从第一个文档中给出的值绘制(使用xsd:keyref)。

目标(a)是可以实现的;目标(b)无法通过XSD实现。 XSD的参照完整性约束旨在用于单个XML文档,而不是跨文档边界。要检查跨文档边界的完整性约束,可以使用W3C的服务建模语言(