氧气和xmllint xsd验证不同 - 哪个是正确的?

时间:2016-10-04 16:17:47

标签: xml xsd saxon xmllint

当我使用Oxygen处理特定的XSD文件时,XSD可以很好地验证我们的XML。

当我使用xmllint时,它表示它无法编译XSD,因为它无效。

使用xmllint进行验证时我们遇到的一个错误是:

./schema.xsd:6: element element: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}element': Invalid value for maxOccurs (must be 0 or 1).
WXS schema ./s.xsd failed to compile

架构是:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" vc:minVersion="1.1" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType mixed="true" name="foo">
        <xs:all>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="bar" type="bar"/>
        </xs:all>
    </xs:complexType>

</xs:schema>

为什么Oxygen和xmllint的验证方式不同?哪一个是对的?

  

可能有用的细节:Oxygen使用Saxon而xmllint使用libxml

修改

使用最小,完整,可验证的示例更新了问题。

1 个答案:

答案 0 :(得分:3)

没有MCVE,这只是猜测......

错误,

  

maxOccurs的值无效(必须为0或1)。

xs:all的孩子在XSD 1.0下拥有maxOccurs unbounded时,通常会出现

如果这是你的问题,那么基于xmllib的验证器(如xmllint)会正确地抱怨,因为它实现了XSD 1.0,而基于撒克逊的验证器(如Oxygen)在根据XSD 1.1进行验证时不会抱怨。

如果这不是您的问题,它可能指向另一个XSD 1.0与XSD 1.1的差异,这会影响您所看到的行为。我建议您在任何情况下配置Oxygen以专门使用XSD 1.0,看看是否不能消除您所看到的差异。