Как указать, что xml-схема, которая требует функций схемы 1.1?

Если я создаю XML-схему, для которой требуются функции схемы 1.1 (особенно тонкие, например удаление необязательного элемента в ограничении базового типа), что лучший способ указать, что эта схема не должна использоваться с процессором, который только понимает версию 1.0?

В файле таблицы стилей XSLT можно указать версию спецификации XSLT, которая используется с атрибутом version.

Но в XSD файле атрибут version не имеет этого значения - это атрибут свободной формы, который говорит что-то о версии схемы, а не о версии используемой спецификации.

И нужно ли обозначать схему, которая использует 1.1 функции?

У меня есть сложный набор схем, использующих спецификацию FPML 5.5 и некоторые настраиваемые схемы, и он не может быть проверен с помощью некоторых валидаторов схемы, но я не уверен, что это связано с тем, что в валидаторе есть ошибки или потому, что схема тонко используя функции xml schema 1.1.

Ответ 1

На данный момент эта проблема не так просто разрешить; это связано с тем, что большинство процессоров XSD равны 1.0, а версия схемы, введенная в спецификации XSD 1.1, не может применяться обратно. Чтобы узнать больше об этом (в общем), посмотрите The Versioning Namepace и примеры, приведенные в разделе 4.2. 2 Условное включение.

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

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning">

    <xsd:element name="e" vc:minVersion="1.1">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" maxOccurs="unbounded"/>       
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="e" vc:minVersion="1.0" vc:maxVersion="1.1">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" />            
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>      
</xsd:schema>

Таким образом, по крайней мере, вы будете использовать одобренный XSD 1.1 подход к управлению версиями; он также поставляется с моделью обработки. Для некоторых задач относительно легко построить предварительный процессор, который, по крайней мере, будет обрабатывать соответствующий выбор XSD-процессора (1.0 или 1.1). Чтобы упростить работу в закрытой среде, вы также можете выбрать соглашение, в котором вы могли бы отметить все xsd:schema с помощью vc: minVersion = "1.1" - в основном, с чего вы, похоже, хотели начать.

Что касается вашего последнего абзаца, выбор XSD-процессора должен утверждаться, а не подразумеваться. Это связано с тем, что XSD 1.1 позволяет создавать конструкции, которые были невозможны в XSD 1.0 (например, компоновщик all, содержащий частицы с макс. Появлением больше 1)... поэтому, если вы не принимаете прежнее решение повторно: процессор для использования, XSD может или может быть недействительным. В то время как другие вещи будут недействительными независимо от используемого процессора.

Ответ 2

Было обсуждено это в списке разработчиков XML Schema: http://lists.w3.org/Archives/Public/xmlschema-dev/2013Sep/0000.html

И было заключено, что мы должны использовать атрибуты vc: minVersion и vc: maxVersion в элементе xsd: schema, если мы хотим указать версию XML-схемы. Атрибуты не находятся в пространстве имен схемы, они находятся в пространстве имен http://www.w3.org/2007/XMLSchema-versioning. Таким образом, вы можете установить их также в XML Schema версии 1.0, и эта схема будет действительна.

Итак, если вы хотите указать, является ли схема версией 1.0, вы можете установить атрибуты версии элемента xsd: schema следующим образом: vc: minVersion = "1.0" vc: maxVersion = "1.1" (minVersion включено), maxVersion является эксклюзивным).

Если вы хотите установить версию схемы в 1.1, вы можете установить атрибуты версии элемента xsd: schema следующим образом: vc: minVersion = "1.1". Атрибут maxVersion не нужно устанавливать в этом случае, потому что у нас еще нет версий XML Schema версии 1.1.

Ответ 3

Если вы хотите выбрать конкретную версию, а не диапазон, вы также можете использовать <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema/v1.1">. Я обнаружил, что в документации по именам пространства версий схемы (благодарность Петру Гардее за ссылку.)

Это был единственный метод, который работал для меня при создании XSD в Visual Studio для использования с файлом XML в том же проекте.