使用导入另一个架构的架构验证 XML 错误,有关导入架构中最初描述的元素的命名空间是错误的

问题描述 投票:0回答:1

我有一个 XML 文件

Baseplate.xml
(见下文),我正在尝试根据模式进行验证
place.xsd
(见下文),它本身导入另一个模式
instance.xsd
(见下文),它本身导入另一个模式
 type.xsd
(见下文)。但是,在
Baseplate.xml
中,在
instance.xsd
type.xsd
中描述架构的元素上,我收到以下错误:

The element 'part' in namespace 'hxxp://luna.localhost/Schema/Place/place.xsd'
 has invalid child element 'position' in namespace 'hxxp://luna.localhost/Schema/Place/place.xsd'.
List of possible elements expected:
 'position' in namespace 'hxxp://luna.localhost/Schema/Place/instance.xsd'.

按照 Google Gemini 的建议,我可以通过手动指定根架构中未描述的每个元素的命名空间来解决此问题

place.xsd

Baseplate.xml
双子座的解决方法:

<?xml version="1.0" encoding="UTF-8"?>
<place
    xmlns="hxxp://luna.localhost/Schema/Place/place.xsd"
>
    <tree>
        <part name="Baseplate">
            <position xmlns="hxxp://luna.localhost/Schema/Place/instance.xsd">
                <x xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">0</x>
                <y xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">-0.5</y>
                <z xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">0</z>
            </position>
            <rotation xmlns="hxxp://luna.localhost/Schema/Place/instance.xsd">
                <x xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">0</x>
                <y xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">0</y>
                <z xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">0</z>
            </rotation>
            <size xmlns="hxxp://luna.localhost/Schema/Place/instance.xsd">
                <x xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">100</x>
                <y xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">1</y>
                <z xmlns="hxxp://luna.localhost/Schema/Place/type.xsd">100</z>
            </size>
        </part>
    </tree>
</place>

但是,由于显而易见的原因,该解决方案并不是非常理想......

我做错了什么?我在模式中导入模式的做法完全错误吗?我应该以其他方式导入它们吗?

我能找到的所有搜索结果都说只需将

elementFormDefault="qualified"
添加到架构中,当我在 place.xsd 中描述的元素上(即在
<tree />
上)遇到此错误时,这
did
 起作用,但没有。无法修复导入模式中描述的元素的错误 
instance.xsd
type.xsd

这是我的原始文件,没有Gemini建议的

Baseplate.xml

中的解决方法,在尝试验证时出现错误:

Baseplate.xml

<?xml version="1.0" encoding="UTF-8"?> <place xmlns="hxxp://luna.localhost/Schema/Place/place.xsd" > <tree> <part name="Baseplate"> <position> <x>0</x> <y>-0.5</y> <z>0</z> </position> <rotation> <x>0</x> <y>0</y> <z>0</z> </rotation> <size> <x>100</x> <y>1</y> <z>100</z> </size> </part> </tree> </place>

type.xsd

<?xml version="1.0" encoding="UTF-8" ?> <xs:schema targetNamespace="hxxp://luna.localhost/Schema/Place/type.xsd" xmlns:xs="hxxp://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" > <xs:complexType name="vector3"> <xs:sequence> <xs:element name="x" type="xs:decimal" /> <xs:element name="y" type="xs:decimal" /> <xs:element name="z" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:schema>

instance.xsd

<?xml version="1.0" encoding="UTF-8" ?> <xs:schema targetNamespace="hxxp://luna.localhost/Schema/Place/instance.xsd" xmlns:xs="hxxp://www.w3.org/2001/XMLSchema" xmlns:type="hxxp://luna.localhost/Schema/Place/type.xsd" elementFormDefault="qualified" > <xs:import namespace="hxxp://luna.localhost/Schema/Place/type.xsd" schemaLocation="type.xsd" /> <xs:complexType name="part"> <xs:sequence> <xs:element name="position" type="type:vector3" /> <xs:element name="rotation" type="type:vector3" /> <xs:element name="size" type="type:vector3" /> </xs:sequence> <xs:attribute name="name" type="xs:string" use="required" /> </xs:complexType> </xs:schema>

place.xsd

<?xml version="1.0" encoding="UTF-8" ?> <xs:schema targetNamespace="hxxp://luna.localhost/Schema/Place/place.xsd" xmlns:xs="hxxp://www.w3.org/2001/XMLSchema" xmlns:type="hxxp://luna.localhost/Schema/Place/type.xsd" xmlns:instance="hxxp://luna.localhost/Schema/Place/instance.xsd" elementFormDefault="qualified" > <xs:import namespace="hxxp://luna.localhost/Schema/Place/type.xsd" schemaLocation="type.xsd" /> <xs:import namespace="hxxp://luna.localhost/Schema/Place/instance.xsd" schemaLocation="instance.xsd" /> <xs:element name="place"> <xs:complexType> <xs:sequence> <xs:element name="tree"> <xs:complexType> <xs:sequence> <xs:element name="part" type="instance:part" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
    
xml xsd
1个回答
0
投票
您的架构描述了三个不同命名空间中的元素。如果您想要创建一个对该模式有效的 XML 实例,则每个元素都必须位于正确的命名空间中,尽管这可能会很不方便。如果您有权这样做,另一种方法是更改架构以使用更少的命名空间 - 这可能意味着更改

targetNamespace

 属性,并使用 
xsl:include
 而不是 
xsl:import

elementFormDefault="qualified"

属性影响具有本地而不是全局声明的元素的命名空间:也就是说,像
tree
这样的元素是在复杂类型定义中定义的,而不是全局定义为
xs:schema的子元素
。设置 
qualified
 表示该元素必须位于模式的目标命名空间中;如果没有此属性,则该元素必须不在命名空间中。

© www.soinside.com 2019 - 2024. All rights reserved.