我有许多XSD架构,它们是由另一个导入的。当针对类似于主包装器的XSD进行验证时,验证器似乎并未将类型与正确的XSD相关联。它似乎在某种程度上混淆了名称空间。
作为最小的示例,请考虑以下两个XSD,每个XSD定义了自己的类型和名称空间:
a.xsd定义a-type
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://a"
targetNamespace="http://a"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<xs:simpleType name="a-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
b.xsd定义b-type
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://b"
targetNamespace="http://b"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:simpleType name="b-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
ab.xsd使用上面定义的类型定义自己的ab-type
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:a="http://a"
xmlns:b="http://b"
xmlns:tns="http://ab"
targetNamespace="http://ab"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:import namespace="http://a" schemaLocation="a.xsd"/>
<xs:import namespace="http://b" schemaLocation="b.xsd"/>
<xs:complexType name="ab-type">
<xs:sequence maxOccurs="1">
<xs:element name="a-tag" type="a:a-type"/>
<xs:element name="b-tag" type="b:b-type"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ab-tag" type="tns:ab-type"/>
</xs:schema>
当我针对以下XML文件验证它时:
<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
xmlns:ab="http://ab"
xmlns:a="http://a"
xmlns:b="http://b">
<a:a-tag>A</a:a-tag>
<b:b-tag>B</b:b-tag>
</ab:ab-tag>
我从xmllint --schema ab.xsd ab.xml
中收到以下错误:
ab.xml:6:元素
a-tag
:架构有效性错误:元素{http://a}a-tag
:不需要此元素。预期为({http://ab}a-tag
)。ab.xml无法验证
使用xsd11-validator.jar
验证时,我也有类似的错误。因此,即使我在ab.xsd
中指定a-tag
的类型为a:a-tag
,它似乎仍然尝试将其与ab
中的命名空间相关联。
A type与在另一个XML名称空间中定义的element不同。
要在a-tag
命名空间中放置http://a
,实际上必须在该命名空间中放置元素声明...
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://a"
targetNamespace="http://a"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<xs:simpleType name="a-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="a-tag" type="tns:a-type"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://b"
targetNamespace="http://b"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:simpleType name="b-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="b-tag" type="tns:b-type"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:a="http://a"
xmlns:b="http://b"
xmlns:tns="http://ab"
targetNamespace="http://ab"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:import namespace="http://a" schemaLocation="a.xsd"/>
<xs:import namespace="http://b" schemaLocation="b.xsd"/>
<xs:complexType name="ab-type">
<xs:sequence maxOccurs="1">
<xs:element ref="a:a-tag"/>
<xs:element ref="b:b-tag"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ab-tag" type="tns:ab-type"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
xmlns:ab="http://ab"
xmlns:a="http://a"
xmlns:b="http://b">
<a:a-tag>A</a:a-tag>
<b:b-tag>B</b:b-tag>
</ab:ab-tag>
如上定义,ab.xml对ab.xsd有效。