我正在使用xmllint进行一些验证,并且我有一个 XML 实例文档,它需要针对两种模式进行验证:一种用于外部“信封”(其中包括任何元素),另一种用于特定的有效负载。假设A.xsd是信封模式,B.xsd是有效负载模式(有不同的可能有效负载),ab.xml是有效的 XML 实例文档(我在帖子末尾提供了一个示例)。
我在同一目录中本地提供了所有三个文件,并且正在使用xmllint执行验证,提供外部(信封)模式的位置作为模式参数:
xmllint -schema A.xsd ab.xml
...然而,尽管我在实例文档中提供了 A.xsd 和 B.xsd 的位置(使用xsi:schemaLocation元素)xmllint未能找到它并抱怨:
ab.xml:8: element person: Schemas validity error : Element '{http://www.example.org/B}person': No matching global element declaration available, but demanded by the strict wildcard.
ab.xml fails to validate
所以显然xmllint没有读取xsi:schemaLocation元素。我知道xmllint可以配置目录,但我无法让xmllint找到这两个模式。在验证实例文档时,我应该如何让xmllint考虑这两种模式,或者是否可以使用其他命令行实用程序或图形工具?
SSCCE
A.xsd - 信封模式
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:a ="http://www.example.org/A"
targetNamespace ="http://www.example.org/A">
<element name="someType" type="a:SomeType"></element>
<complexType name="SomeType">
<sequence>
<any namespace="##other" processContents="strict"/>
</sequence>
</complexType>
</schema>
B.xsd - 有效负载模式
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:b ="http://www.example.org/B"
targetNamespace="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<element name="person" type="b:PersonType"></element>
<complexType name="PersonType">
<sequence>
<element name="firstName" type="string"/>
<element name="lastName" type="string"/>
</sequence>
</complexType>
</schema>
ab.xml - 实例文档
<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A"
xmlns:b="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/A A.xsd
http://www.example.org/B B.xsd">
<b:person>
<b:firstName>Mary</b:firstName>
<b:lastName>Bones</b:lastName>
</b:person>
</a:someType>