xmllint验证在无效输入上成功

时间:2012-12-27 19:41:18

标签: xml xsd xmllint

为什么xmllint不报告以下xsd和xml的验证失败?

t.xsd

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="letter">
   <xs:simpleType>
      <xs:restriction base="xs:string">
      <xs:pattern value="([a-z])+"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>
</xs:schema>

t.xml

 <letter></letter>

$ ./xmllint --schema t.xsd t.xml

<?xml version="1.0"?>
<letter/>
t1.xml validates

2 个答案:

答案 0 :(得分:2)

输入对我来说看起来不合适(Mark O'Connor说这是有效的,但我没有看到任何关于这种效果的论据,只是一个光头的陈述)。同样重要的是,它对Xerces J或Saxon EE看起来并不合适。

众所周知,xmllint中的XSD支持有点不稳定,但大多数情况下这意味着规范的某些部分不受支持;这看起来更像是正则表达式中的直接错误。我在gnome bugtracker for libxml中看到了几个未解决的正则表达式错误;也许这是相关的。我已经用这个问题打开了new bug report

答案 1 :(得分:0)

输入有效。您需要在长度上添加额外的限制....将其称为XML Schema的“功能”: - )

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="letter">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="([a-z])+"/>
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

更新

修改架构如下,然后它看起来像你期望的那样工作

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="letter">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[a-z]+"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>