xmllint无法验证xs:language

时间:2015-03-28 07:59:09

标签: xml validation schema

我正在尝试验证以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://dublincore.org/schemas/xmls/qdc/2008/02/11/dc.xsd">
  <xs:element name="feature">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:annotation>
          <xs:documentation xml:lang="de-x-mt">
            <dc:title xml:lang="de-x-mt">Berg</dc:title>
            <dc:title xml:lang="en-x-mt">Mountain</dc:title>
          </xs:documentation>
        </xs:annotation>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

使用以下xmllint

xmllint: using libxml version 20901
   compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma

xmllint说:

test.xsd:7: element documentation: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}documentation', attribute '{http://www.w3.org/XML/1998/namespace}lang': 'de-x-mt' is not a valid value of the atomic type 'xs:language'.
WXS schema test.xsd failed to compile

我无法弄清楚为什么“de-x-mt”在xs:documentation元素中无效“xs:language”,而相同的“de-x-mt”在dc:title元素中有效。它们都来自xml命名空间,应该以相同的方式处理。它实际上是相同的属性!是吗?!

根据“W3C XML模式定义语言(XSD)1.1第2部分:数据类型”xs:语言定义为:

  

符合模式

的所有字符串的集合      

[A-ZA-Z] {1,8}( - [A-ZA-Z0-9] {1,8})*

显然de-x-mt符合这种模式。

是xmllint错误吗?如何让xmllint验证这样的xs:language标签?

1 个答案:

答案 0 :(得分:0)

深入挖掘libxml2(xmllint使用的一个)我在parser.c中找到函数xmlCheckLanguageID()的注释:

The parser below doesn't try to cope with extension or privateuse
that could be added but that's not interoperable anyway

在下面阅读代码:

if (nxt - cur == 4)
     goto script;
if (nxt - cur == 2)
     goto region;
if ((nxt - cur >= 5) && (nxt - cur <= 8))
     goto variant;
if (nxt - cur != 3)
     return(0);

正如你所看到的那样,没有单身人士的补贴。基本上libxml2的xmlCheckLanguageID不符合扩展或私人单身人士的标准。

要解决此问题,我们需要提供以下代码:

  if (nxt - cur == 1)
       goto extension;

以及以下:

    /* extensions and private use subtags not checked */
extensions:
    return (1);

我已在https://bugzilla.gnome.org/show_bug.cgi?id=749763

提交了错误报告