Одно пространство имен xml равно одному и только одному файлу схемы?

... или Почему эти файлы проверяются в Visual Studio 2010 но не с xmllint 1 ?

В настоящее время я работаю с опубликованной xml-схемой, в которой первоначальный автор обычно разбивает схемы на несколько файлов .xsd, но где некоторые файлы схемы имеют одинаковое targetNamespace . Это действительно «разрешено»?

Пример (чрезвычайно упрощенный):

File    targetNamespace    Contents
------------------------------------------------------------
b1.xsd  uri:tempuri.org:b  complex type "fooType"
b2.xsd  uri:tempuri.org:b  simple type "barType"

a.xsd   uri:tempuri.org:a  imports b1.xsd and b2.xsd
                           definition of root element "foo", that
                           extends "b:fooType" with an attribute
                           of "b:barType"

(Полное содержание файла ниже.)

Затем у меня есть файл xml, data.xml , с таким содержанием:



В течение долгого времени я считал, что все это было правильно, поскольку Visual Studio явно допускает этот стиль схемы. Однако сегодня я решил настроить утилиту командной строки для проверки файлов xml и выбрал xmllint .

Когда я запустил xmllint --schema a.xsd data.xml , Мне представили это предупреждение:

a.xsd: 4: element import: Schemas parser warning: Element '{ http://www.w3.org/2001/XMLSchema } import': Я считал, что все это было правильно, поскольку Visual Studio, очевидно, допускает этот стиль схемы. Однако сегодня я решил настроить утилиту командной строки для проверки файлов xml и выбрал xmllint .

Когда я запустил xmllint --schema a.xsd data.xml , Мне представили это предупреждение:

a.xsd: 4: element import: Schemas parser warning: Element '{ http://www.w3.org/2001/XMLSchema } import': Я считал, что все это было правильно, поскольку Visual Studio, очевидно, допускает этот стиль схемы. Однако сегодня я решил настроить утилиту командной строки для проверки файлов xml и выбрал xmllint .

Когда я запустил xmllint --schema a.xsd data.xml , Мне представили это предупреждение:

a.xsd: 4: element import: Schemas parser warning: Element '{ http://www.w3.org/2001/XMLSchema } import': Пропуск импорта схемы, расположенной в 'b2.xsd' для пространства имен 'uri: tempuri.org: b', поскольку это пространство имен уже было импортировано со схемой, расположенной в 'b1.xsd'.

Тот факт, что импорт b2.xsd был пропущен, очевидно, приводит к этой ошибке:

a.xsd: 9: Атрибут элемента: Ошибка парсера схем: атрибут decl. 'бар', атрибут 'тип': Значение QName '{uri: tempuri.org: b} barType' не преобразуется в (n) определение простого типа.

Если xmllint верен, в опубликованных спецификациях будет ошибка Я работаю против. Есть? И Visual Studio ошиблась бы. Это?

Я понимаю разницу между xs: import и xs: include . Прямо сейчас я просто не понимаю, как xs: include может что-то исправить, поскольку:

  • b1.xsd и b2.xsd имеют то же самое targetNamespace
  • они оба отличаются targetNamespace от a.xsd
  • , и они (не должны) знать друг о друге

Является ли это недостатком в исходной спецификации схемы? Я начинаю думать, что третий пункт имеет решающее значение. Должен ли тот факт, что они не знают друг о друге, привел к их размещению в разных пространствах имен с самого начала?


b1.xsd:



  

b2.xsd:



  
    
  

a.xsd:



  
  
  
    
      
        
          
        
      
    
  


Примечания:

1) Я использую порт Windows libxml2 / xmllint , найденный на www.zlatkovic.com .

22
задан Christoffer Lette 14 February 2011 в 22:32
поделиться