我正在尝试创建XSD Schema,该文件分为几个文件,每个文件都有其自己的名称空间,并且某些元素具有指向另一个名称空间中的键的keyref以保持完整性。
主文件将所有这些文件链接在一起,并且将根据主文件构建XML并对其进行验证。
当文件之间的数据验证正常时,我无法解决问题。如果使用单个文件定义模式,则可以正常工作,但如果不将其分为多个文件,则可以。
我经历了一个非常相似的话题,但是那里的问题是基于重复的根元素,解决方案是扩展一个我不想要实现的东西:
How can I create a XML instance with a XSD that includes keyref from another namespace
但是我基于它构建了一个简单的测试架构。
Test11.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="test11"
xmlns="test11"
xmlns:t1="test11">
<xs:complexType name="Host">
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
<xs:element name="hosts">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="host" type="Host"/>
</xs:sequence>
</xs:complexType>
<xs:key name="Host-PK">
<xs:selector xpath="t1:host"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
Test22.xsd:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="test22"
xmlns:t2="test22"
xmlns:t1="test11"
xmlns="test22" >
<xs:import schemaLocation="Test11.xsd" namespace="test11" />
<xs:element name="servers">
<xs:complexType>
<xs:sequence>
<xs:element name="server">
<xs:complexType>
<xs:attribute name="host" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="Host-FK" refer="t1:Host-PK">
<xs:selector xpath="t2:server" />
<xs:field xpath="@host" />
</xs:keyref>
</xs:element>
</xs:schema>
Root.xsd:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="Root"
xmlns:t2="test22"
xmlns:t1="test11"
xmlns="Root"
xmlns:r="Root">
<xs:import schemaLocation="Test22.xsd" namespace="test22" />
<xs:import schemaLocation="Test11.xsd" namespace="test11" />
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="t2:servers" />
<xs:element ref="t1:hosts" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML文件:
<?xml version="1.0" encoding="utf-8"?>
<r:Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="Root Root.xsd"
xmlns:r="Root"
xmlns:t1="test11"
xmlns:t2="test22" >
<t2:servers>
<t2:server host="AA" />
</t2:servers>
<t1:hosts>
<t1:host id="AA" />
<t1:host id="BB" />
</t1:hosts>
</r:Root>
错误: (8:6)错误Keyref'test22:servers'无法找到所引用的密钥或范围内的唯一密钥。
我该如何解决?