2015-03-28 2 views
0

Я пытаюсь проверить следующий XML:xmllint не проверяет хз: язык

<?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: language» в элементе xs: documentation, в то время как тот же «de-x-mt» действителен в элементе dc: title. Оба они из пространства имен xml и должны обрабатываться одинаково. Это на самом деле тот же атрибут! Это?!

В соответствии с "W3C XML Schema Definition Language (XSD) 1.1 Часть 2: Типы данных" хз: язык определяется как:

множество всех строк, которые соответствуют образцу

[a- zA-Z] {1,8} (- [a-zA-Z0-9] {1,8}) *

Очевидно, что de-x-mt соответствует этому образцу.

Это ошибка xmllint? Как заставить xmllint проверять такие теги xs: language?

ответ

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); 

Как вы можете видеть, нет никаких ограничений на синглтон. По сути, xmlCheckLanguageID библиотеки libxml2 не соответствует стандарту в плане расширения или privateuse singleletons.

Чтобы исправить эту проблему, мы должны иметь следующий код:

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

Смежные вопросы