Элемент XSD против объявлений типов в отдельных пространствах имен? - PullRequest
1 голос
/ 16 октября 2019

У меня есть несколько схем XSD, которые импортированы другой. При проверке на основе основного XSD, подобного оболочке, валидатор, похоже, не связывает тип с правильным XSD. Кажется, что это путает пространство имен по-своему.

В качестве минимального примера рассмотрим следующие два XSD, каждый из которых определяет свой собственный тип и пространство имен:

a.xsd определение a-type:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://a"
           targetNamespace="http://a"
           elementFormDefault="qualified"
           attributeFormDefault="qualified">

  <xs:simpleType name="a-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

</xs:schema>

b.xsd определение b-type:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://b"
           targetNamespace="http://b"
           elementFormDefault="qualified"
           attributeFormDefault="qualified" >

  <xs:simpleType name="b-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

</xs:schema>

ab.xsd который определяет его ab-type, используя определенные выше типы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:a="http://a"
           xmlns:b="http://b"
           xmlns:tns="http://ab"
           targetNamespace="http://ab"
           elementFormDefault="qualified"
           attributeFormDefault="qualified" >

  <xs:import namespace="http://a" schemaLocation="a.xsd"/>
  <xs:import namespace="http://b" schemaLocation="b.xsd"/>

  <xs:complexType name="ab-type">
    <xs:sequence maxOccurs="1">
      <xs:element name="a-tag" type="a:a-type"/>
      <xs:element name="b-tag" type="b:b-type"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ab-tag" type="tns:ab-type"/>

</xs:schema>

Когда я проверяю его по следующему XML-файлу:

<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
    xmlns:ab="http://ab"
    xmlns:a="http://a"
    xmlns:b="http://b">
  <a:a-tag>A</a:a-tag>
  <b:b-tag>B</b:b-tag>
</ab:ab-tag>

Я получаю следующую ошибку отxmllint --schema ab.xsd ab.xml:

ab.xml: 6: элемент a-tag: Ошибка достоверности схемы: Элемент {http://a}a-tag: Этот элемент не ожидается. Ожидается ({http://ab}a-tag). ab.xml не может проверить

У меня также есть похожая ошибка при проверке с xsd11-validator.jar. Таким образом, хотя в ab.xsd я указываю, что a-tag имеет тип a:a-tag, он все еще пытается связать его с пространством имен из ab.

1 Ответ

0 голосов
/ 16 октября 2019

A тип , определяемый в XSD из другого пространства имен XML, не совпадает с элементом , определяемым как другой XMLпространство имен.

Чтобы поместить a-tag в пространство имен http://a, вы должны фактически поместить объявление элемента в это пространство имен ...

a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://a"
  targetNamespace="http://a"
  elementFormDefault="qualified"
  attributeFormDefault="qualified">

  <xs:simpleType name="a-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:element name="a-tag" type="tns:a-type"/>
</xs:schema>

b.xsd

Аналогично объявите b-tag в пространстве имен http://b:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://b"
  targetNamespace="http://b"
  elementFormDefault="qualified"
  attributeFormDefault="qualified" >

  <xs:simpleType name="b-type">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:element name="b-tag" type="tns:b-type"/>
</xs:schema>

ab.xsd

В ab.xsd , измените с xs:element/@name на @ref:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:a="http://a"
  xmlns:b="http://b"
  xmlns:tns="http://ab"
  targetNamespace="http://ab"
  elementFormDefault="qualified"
  attributeFormDefault="qualified" >

  <xs:import namespace="http://a" schemaLocation="a.xsd"/>
  <xs:import namespace="http://b" schemaLocation="b.xsd"/>

  <xs:complexType name="ab-type">
    <xs:sequence maxOccurs="1">
      <xs:element ref="a:a-tag"/>
      <xs:element ref="b:b-tag"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ab-tag" type="tns:ab-type"/>
</xs:schema>

ab.xml

ab.xml в порядке, как:

<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
  xmlns:ab="http://ab"
  xmlns:a="http://a"
  xmlns:b="http://b">
  <a:a-tag>A</a:a-tag>
  <b:b-tag>B</b:b-tag>
</ab:ab-tag>

Как указано выше, ab.xml теперь действует против ab.xsd .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...