0

我有这个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>

我有这两个使用这个xsd作为验证的xml:
首先

<?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。
这就是我现在所面临的,这就是我三天以来一直在努力做的事情。

4

2 回答 2

2

If I understand you correctly, you want to use XSD key and keyref to check (a) that values in one XML document are unique within that document (using xsd:key) and (b) that values in another XML document are drawn only from the values given in the first document (using xsd:keyref).

Goal (a) is achievable; goal (b) is not achievable with XSD. XSD's referential integrity constraints are intended for use within a single XML document, not across document boundaries. To check integrity constraints across document boundaries, you can use the W3C's Service Modeling Language (which essentially is intended to extend XSD with some cross-document integrity checking of this kind) or Schematron. Good luck.

于 2013-08-20T23:30:40.663 回答
-1

f 我理解正确,您想使用 XSD 键和 keyref 来检查 (a) 一个 XML 文档中的值在该文档中是唯一的(使用 xsd:key)和 (b) 另一个 XML 文档中的值是否仅来自第一个文档中给出的值(使用 xsd:keyref)。

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

于 2013-08-23T12:13:05.337 回答