我有这个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天后想要做的事情。
答案 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的服务建模语言(
)