Возможно ли в XSD для xs:переопределить элемент xs:complexType, чтобы требовать атрибут типа?

Цели:

  1. Создайте XSD, где атрибут «тип» требуется для каждого элемента xs:, определенного в схеме.

  2. Иметь возможность повторно использовать переопределенный http://www.w3.org/2001/XMLSchema в других схемах, чтобы заставить все определенные xs:element(s) требовать атрибут "type"

Например, я хотел бы, чтобы следующее было «недопустимым» в нашем XSD (например, в XMLSpy)

<xs:element name="SomeElement"/>

тогда как следующее будет действительным

<xs:element name="SomeElement" type="abc:SomeType"/>

Вот пример схемы, в которой я попытался переопределить <xs:complexType name="element">, чтобы требовать атрибут "тип".

<?xml version="1.0"?>
<!-- edited with XMLSpy v2013 (http://www.altova.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:redefine schemaLocation="http://www.w3.org/2001/XMLSchema.xsd">
        <xs:complexType name="element" abstract="true">
            <xs:complexContent>
                <xs:restriction base="xs:element">
                    <xs:attribute name="type" use="required">
                        <xs:simpleType>
                            <xs:restriction base="xs:QName"/>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:restriction>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="topLevelElement">
            <xs:complexContent>
                <xs:restriction base="xs:topLevelElement"/>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="localElement">
            <xs:complexContent>
                <xs:restriction base="xs:localElement"/>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="narrowMaxMin">
            <xs:complexContent>
                <xs:restriction base="xs:narrowMaxMin"/>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>
    <xs:element name="SomeElement"/>
</xs:schema>

Теперь есть некоторые интересные аспекты этой схемы и некоторое странное поведение в XMLSpy 2013 (без пакета обновления):

  1. В представлении «Текст» при попытке сохранения XMLSpy указывает, что схема «недействительна».

  2. В представлении «Схема» при попытке сохранения XMLSpy указывает, что схема действительна.

  3. Попытка создать образец XML-файла в XMLSpy приведет к ошибке, указывающей, что схема недействительна.

  4. Единственная часть схемы, которая не должна быть допустимой, — это <xs:element name="SomeElement">, поскольку она не была определена с помощью атрибута «тип».

  5. Возникающие ошибки связаны с дублированием объявлений; но то, что предпринимается, является переопределением, а не другим объявлением.

Вопросы:

  1. Можно ли переопределить <xs:complexType name="element">, чтобы требовать атрибут «тип»?
  2. Можно ли использовать этот переопределенный тип в других XSD с другим «targetNamespace»?

person teckno.query    schedule 10.07.2013    source источник


Ответы (1)


Поскольку «XSD» — это язык схемы XML W3C, контролируемый W3C, вы не можете ничего в нем переопределить. В частности, вы не можете переопределить что-либо, определенное в пространстве имен http://www.w3.org/2001/XMLSchema!

И как ты мог? В конце концов, что бы вы ни делали, вам всегда нужно начинать с обычного элемента <xs:schema>, который уже определен в этом пространстве имен, а «определенный» здесь означает, что любое возможное содержимое <xs:schema> также уже определено. Здесь не может быть какой-то бутстреппинг! Тогда это был бы другой язык. (Хотя идея действительно любопытная — запишите ее и отправьте в W3C!)

Ну, что вы можете сделать, так это определить свой собственный язык схемы XML (например, «XSDX»)… но в другом пространстве имен, и да, вы можете основывать его на стандартном XSD. Просто импортируйте пространство имен http://www.w3.org/2001/XMLSchema и повторно используйте любые определенные там конструкции (то есть глобальные компоненты). Какая польза от этого языка «XSDX» — это отдельная история... (Думаю, вам придется разработать какое-то новое программное обеспечение для работы с ним.)

Однако я предполагаю, что ваша реальная цель состоит в том, чтобы проверить ваши XML-схемы на соответствие некоторым дополнительным требованиям (например, об этом атрибуте "тип").

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

Кроме того, вы можете заменить (временно) строку http://www.w3.org/2001/XMLSchema в вашей схеме (схемах) на URI, представляющий ваш расширенный язык схемы XML. Тогда любое стандартное программное обеспечение будет думать, что это просто еще один XML, и делать с ним любые проверки или что-то еще. Однако все же потребуется полноценное определение вашего расширенного языка XML-схемы — в форме некоторой (обычной) XML-схемы для него.

person ColdFusion    schedule 11.07.2013