Переопределить значение атрибута глобального элемента в XSD

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

<?xml version="1.1" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="b" type="bType" minOccurs="0"/>
                <xs:element name="a" type="bType">
            </xs:all>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="bType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Hey"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:schema>

XML, соответствующий приведенному выше XSD, выглядит следующим образом.

<root>
    <a type="Hey">
        <name>kjre</name>
    </a>
</root>

Я хочу переопределить значение атрибута этого типа в элементе "a". Поскольку все определения элементов в «bType» именно такие, как я хочу, я хотел использовать bType с единственной разницей в значении атрибута «type». Мне нужен был способ, при котором XSD будет таким же, но разрешено переопределение значения «типа». Короче говоря, я хотел что-то вроде ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="b" type="bType" minOccurs="0"/>
                <xs:element name="a" type="bType">
                    <xs:complexType>
                        <xs:attribute name="type">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="Eat"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="bType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Hey"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:schema>

Таким образом, XML, соответствующий XSD, может быть:

<root>
    <a type="Eat">
        <name>kjre</name>
    </a>
</root>

Возможно ли это в XSD 1.1?


person Feather Ridgemont    schedule 12.12.2019    source источник


Ответы (1)


Вы не сказали, каким требованиям должна удовлетворять новая схема.

Документы, действительные для новой схемы, не будут действительными для старой, поэтому маловероятно, что какой-либо инструментарий, созданный для старой схемы, можно будет повторно использовать для новой. Так зачем пытаться вывести новую схему из старой? Почему бы просто не скопировать файлы и не изменить перечисление для значений атрибута type? Если есть ответ на этот вопрос, он может пролить свет на ваши фактические требования.

Если требований нет, то подойдет любой ответ, и вряд ли вы получите какие-то полезные ответы.

Если ответ «Я хочу использовать старый инструментарий», то, как только что упоминалось выше, решения нет: инструментарий для старой схемы настроен на ожидание именно тех значений, которые перечислены в старой схеме — добавление новых значений просто такая вещь, которая сломает инструмент.

Если ответ таков: «Я хочу иметь возможность внедрять новые версии базовой схемы как можно проще и быстрее, и я хочу иметь четкое разграничение того, что было изменено локально по сравнению с базовой схемой», тогда я d предлагает использовать XSD 1.1 и использовать средство xsd:redefine. Не существует хорошего способа указать, что вы просто хотите изменить анонимный тип, встроенный в объявление атрибута внутри объявления элемента внутри именованного типа — создатель базовой схемы довольно ясно дал понять, что набор перечислимых значений для Атрибут 'type' не предназначен для повторного использования или независимой модификации, или вообще как 'вещь', если говорить серьёзно, но переопределение позволит вам предоставить новое определение {}bType и оставить всё остальное без изменений.

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

person C. M. Sperberg-McQueen    schedule 26.12.2019
comment
Я прихожу сюда очень поздно, так как на какое-то время приостановил эту задачу. Новая схема должна была переопределить значение атрибута type элемента bType для элемента a. Итак, вы имеете в виду, что если у меня есть сложный тип, атрибуты которого имеют некоторые значения перечисления, я не могу расширить этот сложный тип И изменить значения перечисления? - person Feather Ridgemont; 20.02.2020
comment
Если все, что вам нужно, это схема с другим нумерованным значением type, ничто не мешает вам написать ее. Если у вас есть дополнительные требования, которые не будут удовлетворены путем написания новой схемы или изменения старой на месте, вам нужно сказать, каковы эти требования, иначе вы вряд ли получите какие-либо полезные ответы. - person C. M. Sperberg-McQueen; 11.02.2021