Одним из возможных решений этой проблемы является разбиение XSD на два файла:
Один для первого отсутствующего пространства имен (a.xsd
) и один для второго пространства имен (b.xsd
), которое объявлено targetNamespace=...
в b.xsd
, тогда как a.xsd
не нуждается в таком объявлении. Второй файл с собственным пространством имен импортируется с помощью инструкции <xsd:import namespace="..."
. Это пространство имен также должно быть включено в объявление пространства имен элемента xsd:schema
(здесь xmlns:std
).
То есть a.xsd
это:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:std="http://tow.gow.ho.com/2009/08/StandardHeader">
<xsd:import namespace="http://tow.gow.ho.com/2009/08/StandardHeader"
schemaLocation="b.xsd" />
<xsd:element name="myTest">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element ref="std:standardHeader" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
А b.xsd
- это:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tow.gow.ho.com/2009/08/StandardHeader">
<xsd:element name="standardHeader">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="data" minOccurs="0">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="LEVELDATA" minOccurs="0" type="xsd:normalizedString"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Эти два XSD действительно проверяют ваш XML-файл с его пространством имен как есть.
Этот ответ был вдохновлен этой веб-страницей: "Multi-Schema Project:
Ноль, одно или много пространств имен? ". Он не копирует решения 1-к-1, но скорее вдохновлен этой веб-страницей.