我有以下简单的XSD架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://test" elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:tns="http://test"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="AType">
<xs:sequence>
<xs:element name="info" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="A" type="tns:AType"/>
</xs:schema>
以下简单XML文档是否与此架构有效?
<?xml version="1.0" encoding="UTF-8" ?>
<X xsi:type="AType"
xmlns="http://test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<info>text</info>
</X>
我在使用JAXP和默认J2SE 1.7解析器的在线验证器中尝试了它,并且XML文档成功验证(http://www.utilities-online.info/xsdvalidation/)。 另一方面,xmllint说
Schemas validity error : Element '{http://test}X': No matching global declaration
available for the validation root. test2.xml fails to validate
他们使用不同的验证模式吗? J2SE解析器使用的模式是否基于XSD规范?
对问题的修正:
Michael Kay将我(下面)指向XSD规范中的特定位置。我试图破译XSD规范所说的内容。我是否理解正确:
...元素信息项的模式有效性可能松散评估如果其“上下文确定的声明”没有通过“验证”关于“ur-type definition”跳过。
答案 0 :(得分:0)
是的,XSD规范确实定义了多个“验证模式”,并且不同的工具可以使用不同的选项。参见
http://www.w3.org/TR/xmlschema-1/#validation_outcome
我希望默认(如果你没有指定要验证的元素或类型名称)为(3),这会带你进入模式有效性评估(元素):
http://www.w3.org/TR/xmlschema-1/#cvc-assess-elt
这基本上说必须有(a)与实例中最外层元素的名称匹配的全局元素声明,或(b)与其xsi:type属性匹配的全局类型定义。当然,实例必须对该元素声明或类型有效。由于您的实例具有xsi:type属性,我希望它可以针对该类型进行验证。