Схема XML: расширяемый контейнерный элемент - PullRequest
1 голос
/ 14 октября 2011

Я пытаюсь создать схему для документа, который будет иметь несколько пространств имен.Примерно так:

<?xml version="1.0"?>
<parent xmlns="http://myNamespace"
        xmlns:c1="http://someone/elses/namespace"
        xmlns:c2="http://yet/another/persons/namespace">

    <c1:child name="Jack"/>
    <c2:child name="Jill"/>
</parent>

Это то, что я пока имею в своей схеме:

<xs:element name="parent" type="Parent"/>

<xs:complexType name="Parent">
    <!-- don't know what to put here -->
</xs:complexType>

<!-- The type that child elements must extend -->           
<xs:complexType name="Child" abstract="true">
    <xs:attribute name="name" type="xs:string"/>
</xs:complexType>

План состоит в том, чтобы другие могли создавать документы с произвольными дочерними элементами, какПока эти дочерние элементы расширяют мой тип Child.Мой вопрос: как я могу ограничить элемент <parent> таким образом, чтобы он мог содержать только элементы, типы которых являются расширениями типа Child?

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Я нашел ответ здесь: XML-схемы: лучшие практики - контейнеры с переменным содержимым .

Очевидно, вы можете объявить <element> s как abstract.Решение состоит в следующем:

<xs:element name="parent" type="Parent"/>

<xs:element name="child" abstract="true"/>

<xs:complexType name="Parent">
    <xs:sequence>
        <xs:element ref="child" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Child" abstract="true">
    <xs:attribute name="name" type="xs:string"/>
</xs:complexType>

Затем другие схемы могут определять свои собственные дочерние типы, например:

<xs:element name="child-one" substitutionGroup="child" type="ChildOne"/>

<xs:element name="child-two" substitutionGroup="child" type="ChildTwo"/>

<xs:complexType name="ChildOne">
    <xs:complexContent>
        <xs:extension base="Child"/>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="ChildTwo">
    <xs:complexContent>
        <xs:extension base="Child"/>
    </xs:complexContent>
</xs:complexType>

Затем мы можем иметь это в качестве действительного документа:

<parent>
    <c1:child-one/>
    <c1:child-two/>
</parent>
0 голосов
/ 14 октября 2011

Пожалуйста, найдите ссылку ниже.Это говорит о том, как наследуются элементы.

http://www.ibm.com/developerworks/library/x-flexschema/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...