Можно ли определить xs: any с обязательными элементами внутри? - PullRequest
1 голос
/ 07 октября 2011

Меня интересуют файлы XML со структурой:

<resource>
    <type>STRING</type>
    <metadata>
        <ANY_EXTERNAL_ELEMENT1>
            <value>STRING</value> 
        </ANY_EXTERNAL_ELEMENT1>
        <ANY_EXTERNAL_ELEMENT2>
            <reference>STRING</reference> 
        </ANY_EXTERNAL_ELEMENT2>
        <ANY_EXTERNAL_ELEMENT3>
            <value>STRING</value> 
        </ANY_EXTERNAL_ELEMENT3>
    </metadata>
</resource>

Элемент метаданных должен иметь как минимум один дочерний элемент ANY_EXTERNAL_ELEMENT, для которого требуется только один дочерний элемент с именем в наборе {"reference", "value"}.

Возможно ли достичь этого в XMLSchema?

Что я пробовал:

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

    <xs:element name="resource">
        <xs:complexType>
            <xs:all>
                <xs:element name="type" type="xs:string"/>
                <xs:element name="metadata">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any minOccurs="1">
                                <xs:complexType>
                                    <xs:choice>
                                        <xs:element name="reference"/>
                                        <xs:element name="value"/>
                                    </xs:choice>
                                </xs:complexType>
                            </xs:any>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>

</xs:schema>

Но это недействительно. Мне нужна помощь.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

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

<resource>
<type>STRING</type>
<metadata>
    <external value="STRING">
        <ANY-EXTERNAL-ELEMENT-1/>
    </external>
    <external ref="STRING">
        <ANY-EXTERNAL-ELEMENT-2/>
    </external>
</metadata>
</resource>

Но, конечно, я понятия не имею, каков ваш вариант использования.

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

Я думаю, что вы должны перечислить возможные элементы (ANY-EXTERNAL-ELEMENT-1 и т. Д.) Либо в xs: choice, либо с помощью группы подстановки, если вы хотите содержать их тип.

...