Ограничение строки xsd после импорта - PullRequest
0 голосов
/ 10 декабря 2011

Представьте, что у меня есть файл basic.xsd, определяющий некоторый атрибут myAttribute в некотором элементе myElement как xsd:string.

Теперь я хотел бы импортировать этот basic.xsd в мой special.xsdи сделайте определение myAttribute более строгим, допустив только значение a или b.Некоторые другие реализации anotherSpecial.xsd могут захотеть ограничить возможные значения lorem и ipsum.

Как это можно сделать?Можно ли сделать атрибут абстрактным?

1 Ответ

2 голосов
/ 10 декабря 2011

Атрибуты или элементы не могут быть «переопределены»; поэтому вам нужно убедиться, что ваш атрибут имеет простой тип, который определен глобально; является ли атрибут глобальным или нет, это не имеет значения. Атрибуты, в отличие от элементов, не могут быть помечены как абстрактные.

Я буквально пойму, что вы хотите изменить область значений для атрибута, связанного с элементом в basic.xsd, и ничего больше. Вот как бы я это сделал:

basic.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="myElement">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute name="myAttribute" type="tmyAttribute"/>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>  

    <xsd:simpleType name="tmyAttribute">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
</xsd:schema>

Допустимый образец XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<myElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" myAttribute="myAttribute1" xmlns="http://tempuri.org/XMLSchema.xsd">myElement1</myElement>

special.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:redefine schemaLocation="basic.xsd">
        <xsd:simpleType name="tmyAttribute">
            <xsd:restriction base="tmyAttribute">
                <xsd:enumeration value="a"/>
                <xsd:enumeration value="b"/>
            </xsd:restriction>
        </xsd:simpleType>       
    </xsd:redefine>
</xsd:schema>

При проверке в файле special.xsd приведенный выше XML теперь недействителен; измените значение атрибута myAttribute в примере XML на a, и оно будет работать.

Если у кого-то, использующего этот XSD, возникла проблема с переопределением, например, например, инструменты, которые связывают XSD с кодом, тогда я бы посмотрел на инструмент рефакторинга XML-схемы, который может взять ваш special.xsd и автоматически преобразовать его в эквивалентный формат без xsd: redefine. Что бы вы практически делали, это держали «интеллектуальную собственность», которая находится в special.xsd отдельно от basic.xsd; в то время как изменения в basic.xsd могут автоматически поддерживаться и быть видимыми для потребителей special.xsd без необходимости «перекодировать» XSD снова и снова ...

...