Как расширить xml-схему из другой xml-схемы? - PullRequest
3 голосов
/ 08 января 2012

У меня есть XML-документ, который выглядит примерно так, как показано ниже (resources.xml), с соответствующей xml-схемой (resources.xsd).Этот XML-документ поддерживается вручную (т.е. добавление / удаление / редактирование элементов ресурса).Всего может быть 500-1000 элементов ресурса.Каждый ресурс может иметь вариант X или вариант Y (в «реальной жизни» есть еще несколько вариантов).

Я хотел бы разделить XML-документ на несколько XML-документов.Один xml-документ для каждого варианта (в данном случае X и Y) с соответствующими новыми xml-схемами.XML-схемы для каждого варианта должны расширять исходную схему и добавлять только «жестко закодированное» (фиксированное?) Значение для своего «варианта» атрибута.

Причина: чтобы не повторять атрибут «Вариант» в каждом элементе ресурса.

Возможно ли это?Как будут выглядеть xml-схемы для каждого варианта?Какие изменения нужно сделать в resources.xsd?

Любые другие предложения также приветствуются:)

resources.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="resources.xsd">
        <resource name="res00" variant="X" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
        <resource name="res01" variant="X" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
        <resource name="res02" variant="Y" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
        <resource name="res03" variant="Y" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
    </resources>

resources.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:rb="http://example.org/resourcebase">

    <xs:complexType name="property">
        <xs:attribute name="name" type="xs:string" />
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="resource">
        <xs:sequence>
            <xs:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="variant" type="xs:string" use="required" />
    </xs:complexType>

    <xs:element name="resources">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="resource" type="resource" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Вот как я это представляю.Один XML-документ для варианта = X, который ссылается на resourcesX.xsd.Нет необходимости добавлять атрибут «Вариант», так как он добавляется указанными ресурсами X.xsd.

resourcesX.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="resourceX.xsd">
        <resource name="res00" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
        <resource name="res01" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
    </resources>

Другой XML-документ для варианта = Y, который ссылается наresourcesY.xsd.Нет необходимости добавлять атрибут «option», так как он добавляется указанными ресурсами Y.xsd.

resourcesY.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="resourceY.xsd">
        <resource name="res02" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
        <resource name="res03" >
            <property name="propA" value="..." />
            <property name="propB" value="..." />
        </resource>
    </resources>

Могут ли resourceX.xsd и resourceY.xsd расширить ресурсы.xsd?Если так, то как бы они выглядели?какие-либо изменения должны быть сделаны в resources.xsd?

Спасибо!/ Alex

Ответы [ 2 ]

1 голос
/ 08 января 2012

Чтобы разделить это на несколько файлов схемы, вам сначала нужно изменить базовую схему, включив в нее только те типы и элементы, которые будут использоваться совместно, и потребуется уточнить эти элементы, чтобы разрешить расширение (или ограничение в ваших производных схемах). ). В вашем случае, похоже, что тип property будет использоваться повторно, а тип resource будет ограничен, поэтому базовая схема будет выглядеть примерно так:

resources.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="property">
        <xs:attribute name="name" type="xs:string" />
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="resource">
        <xs:sequence>
            <xs:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="variant" type="xs:string"/>
    </xs:complexType>

</xs:schema>

Обратите внимание, что в ресурсе атрибут variant больше не равен use="required", поскольку ваша цель состоит в том, чтобы вы не хотели, чтобы это требовалось в ваших экземплярах документов.

Для варианта схемы 'X' вам нужно будет включить схему resources.xsd и определить ограниченный элемент resourceX и содержащий элемент resources.

resourceX.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="resources.xsd"/>

    <xs:complexType name="resourceX">
        <xs:complexContent>
            <xs:restriction base="resource">
                <xs:sequence>
                    <xs:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" use="required" />
                <xs:attribute name="variant" type="xs:string" fixed="X"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="resources">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="resource" type="resourceX" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Оператор xs:include будет включать вашу ранее определенную схему. Новые типы resourceX определяют ваше ограничение для элемента resource и связывают фиксированное значение X с variant. Наконец, элемент resources переопределяется как набор элементов типа resourceX вместо resource.

resourceY.xsd будет определен аналогично resourceX.xsd.

1 голос
/ 08 января 2012

Похоже, ваша цель состоит в том, чтобы в конкретном файле были только ресурсы одного варианта, в этом случае вместо удаления атрибута variant имеет ли смысл перенести его в корневой тип resources? Это позволило бы структуре документа сохранять информацию о том, какой вариант представляется, но также гарантировало бы, что все элементы resource в конкретном файле связаны с конкретным вариантом. Что-то вроде:

resources.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="property">
        <xs:attribute name="name" type="xs:string" />
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="resource">
        <xs:sequence>
            <xs:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>

    <xs:element name="resources">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="resource" type="resource" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="variant" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

и экземпляр документа:

resourceX.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="resources.xsd"
        variant="X">
    <resource name="res00" >
        <property name="propA" value="..." />
        <property name="propB" value="..." />
    </resource>
    <resource name="res01" >
        <property name="propA" value="..." />
        <property name="propB" value="..." />
    </resource>
</resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...