XInclude Проверка схемы / пространства имен?

Я пытаюсь использовать XML Includes, чтобы помочь управлять большой структурой XML, которая должна быть удобной для людей и машин.

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

Мой файл "main.xml" не проверяется.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

Файл child.xml проверяет штраф как отдельный файл.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

Вот моя схема:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

Мои проблемы почти очевидно связаны с пространствами имен, но я не знаю, как решить мою проблему.

4 ответа

Решение

Как уже указывал skaffman, XML Schema и XInclude не совместимы.

Сообщение об ошибке валидации от xmllint ясно говорит об этом:

main.xml:9: element include: Schemas validity error : Element  '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate

Процитируем Рекомендацию W3C: "XInclude не определяет никакого отношения к расширенным информационным наборам, созданным путем применения схемы XML. Такой расширенный информационный набор может быть предоставлен в качестве входного информационного набора, или такое дополнение может быть применено к информационному пакету, полученному в результате включения".

Таким образом, вы должны сначала создать весь XML-файл, применяя XInclude, а затем проверить этот файл.

Изменить: Вы можете использовать xmllint с --xinclude для проверки main.xml.

Я согласен с grantwparks - XInclude и XML Schema абсолютно могут использоваться вместе. Спецификации намеренно независимы друг от друга. Очевидно, что авторы XInclude хотели предоставить свободу обработки включений до проверки или после проверки.

В этой теме, посвященной speedreviews, обсуждается проблема, и ответ, который помог мне разобраться в этом вопросе, - это сообщение на xml.com со ссылкой на него:

Одним из наиболее распространенных вопросов о XInclude является то, как включение взаимодействует с валидацией, XSL-преобразованием и другими процессами, которые могут применяться к документу XML. Короткий ответ - это не так. XInclusion не является частью какого-либо другого процесса XML. Это отдельный шаг, который вы можете или не можете выполнять, когда и где это полезно для вас.

Например, рассмотрим проверку по схеме. Документ может быть проверен перед включением, после включения или обоими. Если вы проверяете документ до замены элементов xi:include, тогда схема должна объявлять элементы xi:include так же, как и любой другой элемент. Если вы проверите документ после замены элементов xi:include, то схема должна объявить элементы замены. Включение и проверка - это отдельные ортогональные процессы, которые можно выполнять в любом порядке, удобном в локальной среде.

Таким образом, все сводится к тому, чтобы заставить ваши XML-инструменты обрабатывать элементы xi:include перед проверкой (это то, что нужно в примере OP). Например, в XML-редакторе Eclipse есть параметр "Обрабатывать XML-включения" в XML -> XML-файлы -> Проверка (с использованием RSA 8.5), который необходимо включить, чтобы редактор мог обрабатывать xi:include before Проверка.

Энди

Я не думаю, что это вызвано несовместимостью между XInclude и схемой; мне кажется, что включение не обрабатывается перед проверкой. Таким образом, схема не допускает элемент include в main, только дочерний элемент. Если бы вы могли заставить ваш XML-процессор обрабатывать включения перед проверкой...

Я не думаю, что спецификации XML Schema и XInclude гарантированно совместимы друг с другом. Отдельные процессоры XML могут это позволить, а другие - нет.

Как правило, я бы сказал, что эти два не должны использоваться вместе.

PS Я не уверен, почему вы думаете, что это проблема пространства имен. Что дает вам такое впечатление?

Другие вопросы по тегам