如何创建在另一个名称空间中包含keyref的XSD架构?

时间:2019-08-08 15:49:29

标签: xsd namespaces keyref

我正在尝试创建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'无法找到所引用的密钥或范围内的唯一密钥。

我该如何解决?

0 个答案:

没有答案
相关问题