Есть ли способ, чтобы схема использовала определяемые пользователем элементы в своей структуре? - PullRequest
2 голосов
/ 24 февраля 2010

Мне интересно, возможно ли, чтобы схема использовала определяемые пользователем элементы (из XML) для своей структуры.

Как и в случае с пользователем, я мог бы иметь что-то вроде:

<subjectType>
   <name>plane</name>
   <name>bird</name>
</subjectType>
<questionType>
   <name>organic</name>
   <name>awesome</name>
</questionType>
<subjectInterview subjectType="plane">
   <question questionType="organic">false</question>
   <question questionType="awesome">true</question>
</subjectInterview>
<subjectInterview subjectType="bird">
   <question questionType="organic">true</question>
   <question questionType="awesome">false</question>
</subjectInterview>

Таким образом, схема будет знать о:

  • subjectType
  • questionType
  • subjectInterview
  • вопрос

но не определяемые пользователем подэлементы.Было бы понятно, как элементы вкладываются друг в друга и имеют другие ограничения (он будет обрабатывать пользовательские значения, такие как перечисления, чтобы предотвратить опечатки и предотвращать дублирование questionType для subjectType).

Как мне поступить, чтобы получитьэтот тип пользовательского контента, который будет принудительно применен в схеме?

edit: если это имеет значение, я также планирую отменять передачу пользовательского xml классам java.

спасибо

1 Ответ

0 голосов
/ 02 марта 2010

ОК - обнаружил, что я должен использовать "key" и "keyref" в схеме.

Первый - модифицированный файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <subjectType>
       <subject idref="plane"/>
       <subject idref="bird"/>
    </subjectType>
    <questionType>
        <question idref="organic"/>
        <question idref="awesome"/>
    </questionType>
    <subjectInterview id="plane">
       <question id="organic">false</question>
       <question id="awesome">true</question>
    </subjectInterview>
    <subjectInterview id="bird">
       <question id="organic">true</question>
       <question id="awesome">false</question>
    </subjectInterview>
</root>

и вот схема:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="subjectType" type="subjectType" maxOccurs="unbounded"/>
                <xs:element name="questionType" type="questionType" maxOccurs="unbounded"/>
                <xs:element name="subjectInterview" type="subjectInterview" maxOccurs="unbounded">
                    <xs:key name="questionID">
                        <xs:selector xpath="./question"/>
                        <xs:field xpath="@id"/>
                    </xs:key>

                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:key name="subjectID">
            <xs:selector xpath="./subjectInterview"/>
            <xs:field xpath="@id"/>
        </xs:key>
        <xs:keyref name="subjectIDref" refer="subjectID">
            <xs:selector xpath="./subjectType/subject"/>
            <xs:field xpath="@idref"/>
        </xs:keyref>

        <xs:keyref name="questionIDref" refer="questionID">
            <xs:selector xpath="./questionType/question"/>
            <xs:field xpath="@idref"/>
        </xs:keyref>
    </xs:element>

    <xs:complexType name="subjectInterview">
        <xs:sequence  maxOccurs="unbounded">
            <xs:element name="question" type="question"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="question">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="subjectType">
        <xs:sequence>
            <xs:element name="subject" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="idref" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="questionType">
        <xs:sequence>
            <xs:element name="question" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="idref" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

Должно быть достойной базой для людей, пытающихся сделать то же самое.

...