为什么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
答案 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>