我有一个 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>
targetNamespace
属性,并使用
xsl:include
而不是
xsl:import
。
elementFormDefault="qualified"
属性影响具有本地而不是全局声明的元素的命名空间:也就是说,像
tree
这样的元素是在复杂类型定义中定义的,而不是全局定义为
xs:schema
的子元素。设置
qualified
表示该元素必须位于模式的目标命名空间中;如果没有此属性,则该元素必须不在命名空间中。