Схема XML - дочерние элементы, зависящие от существования необязательного атрибута - PullRequest
5 голосов
/ 15 января 2010

Можно ли определить в XSD следующий сценарий:

  1. Родительский элемент имеет атрибут,

    необязательно.

  2. Если атрибут не

    present in XML, at least one child
    
    element must exists.
    
  3. Если

    attribute is present, there can be
    
    zero or more child elements.
    

Пример: * * один тысяча двадцать-одна

ДЕЙСТВИТЕЛЬНО

<parent externel-source="some_name" />



<parent externel-source="some_name">

  <child>some value</child>

</parent>



<parent>

  <child> some value</child>

</parent>

НЕ ДЕЙСТВИТЕЛЬНО

<parent />

Ответы [ 4 ]

3 голосов
/ 18 января 2010

Нет .. причина в том, что: в вашем случае вы пытаетесь проверить наличие элемента / тега в зависимости от значения какого-либо другого тега / атрибута .. (XSD - это в основном набор объявлений), который требует многократного объявления одного элемента ..
Многократное объявление одного и того же элемента в XSD не допускается .. :-(
Проверьте похожую проблему (нажмите здесь) опубликовано членом stackOverFlow

0 голосов
/ 21 декабря 2012

Да, определенно вы можете, используя xsi: type (что, вероятно, не то, что вы хотите!). Например, с xsd ниже;

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:element name="data">
    <xs:complexType>
        <xs:choice>
            <xs:element ref="elemParent" minOccurs="1"  maxOccurs="unbounded"/> 
        </xs:choice>
    </xs:complexType>
</xs:element>
<xs:element name="elemParent" type="ctBase"></xs:element>
<xs:complexType name="ctNoAttChildReq">
    <xs:complexContent>
        <xs:extension base="ctBase">
            <xs:sequence>
                <xs:element name="elemKid" type="xs:string"></xs:element>
                <xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element>
            </xs:sequence>              
        </xs:extension>
    </xs:complexContent>    
</xs:complexType>
<xs:complexType name="ctAttNoChild">
    <xs:complexContent>
        <xs:extension base="ctBase">
            <xs:attribute name="attReq" use="required"/>
        </xs:extension>
    </xs:complexContent>        
</xs:complexType>       
<xs:complexType name="ctBase" abstract="true">
    <xs:sequence/>
</xs:complexType>       

вы получаете экземпляр, у которого есть либо атрибут, либо один или несколько детей, но вы должны иметь xsi: type в экземпляре, который может быть или не быть ограничителем показа.

<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd">
<elemParent  attReq="Yo!" xsi:type="ctAttNoChild"/>
<elemParent xsi:type="ctNoAttChildReq">
    <elemKid>Adam</elemKid>
</elemParent>
<elemParent xsi:type="ctNoAttChildReq">
    <elemKid>Eve</elemKid>
    <elemKidAdditional>Sid</elemKidAdditional>
</elemParent>   

0 голосов
/ 17 февраля 2012

Извините, что воскресил это сообщение, но я подумал, что могу добавить немного к «почему» вещей. W3C XML-схема требует, чтобы все ее последовательности были полностью детерминированными. Из соображений производительности / простоты он не предназначен для того, чтобы смотреть в будущее или оглядываться назад, он работает только с текущим элементом. Также я считаю, что это унаследовано от SGML.

То, что вы хотите сделать, требует такой функциональности. Возможно, вы захотите взглянуть на Schematron; он поддерживает то, что вы хотите.

0 голосов
/ 15 января 2010

Нет, я думаю, нет.

...