Схема XML - как определить элемент, содержащий строку или дочерние элементы - PullRequest
1 голос
/ 17 июня 2010

Мне нужно определить схему XML. Результат должен выглядеть так:

<option value="priority">4</option>
<option value="values">
    <value name="x86-32" lang="en-GB" group="root">x86 32-Bit</value>
    <value name="x86-64" lang="en-GB" group="root">x86 64-Bit</value>
    <value name="ARM" lang="en-GB" group="root">ARM</value>
    <value name="PowerPC" lang="en-GB" group="root">PowerPC</value>
    <value name="SPARC" lang="en-GB" group="root">SPARC</value>
    <value name="PA-RISC" lang="en-GB" group="root">PA-RISC</value>
    <value name="DEC-Alpha" lang="en-GB" group="root">DEC Alpha</value>
</option>
<option value="editable">true</option>

Таким образом, элемент «option» содержит либо строку, либо набор дочерних элементов со строками. Я пробовал что-то вроде этого:

<xs:element name="options" minOccurs="0"  maxOccurs="1">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="option" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">                              
                            <xs:attribute name="value" use="required" type="xs:string" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>                       

Но валидатор не допускает это определение:

cvc-complex-type.2.2: Элемент 'option' не должно иметь элемента [children], и значение должно быть действительным.

Есть идеи, как ее решить?

С наилучшими пожеланиями, Радек

1 Ответ

1 голос
/ 17 июня 2010

Хорошо, я думаю, что нашел приемлемое (для меня) решение:

<xs:element name="options" minOccurs="0"  maxOccurs="1">
<xs:complexType>
    <xs:choice maxOccurs="unbounded">                                                                       
        <xs:element name="option" maxOccurs="unbounded">
              <xs:complexType>
                <xs:simpleContent>
                    <xs:extension base="xs:string">                              
                        <xs:attribute name="attribute" use="required" type="xs:string" />
                    </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
        </xs:element>
        <xs:element name="values" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="value" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:simpleContent> 
                                <xs:extension base="xs:string"> 
                                    <xs:anyAttribute/>
                                </xs:extension>
                            </xs:simpleContent>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="attribute" use="required" type="xs:string" />
              </xs:complexType>
        </xs:element>                                                                       
    </xs:choice>
</xs:complexType>

Это позволяет мне создать такой файл XML:

<option attribute="priority">4</option>
<values attribute="fieldOptions">
    <value name="x86-32" lang="en-GB" group="root">x86 32-Bit</value>
    <value name="x86-64" lang="en-GB" group="root">x86 64-Bit</value>
    <value name="ARM" lang="en-GB" group="root">ARM</value>
    <value name="PowerPC" lang="en-GB" group="root">PowerPC</value>
    <value name="SPARC" lang="en-GB" group="root">SPARC</value>
    <value name="PA-RISC" lang="en-GB" group="root">PA-RISC</value>
    <value name="DEC-Alpha" lang="en-GB" group="root">DEC Alpha</value>
</values>
<option attribute="editable">true</option>

Спасибо AllenG за предложение:)

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