Domanda

Ho provato tutte le <xs:all>, <xs:choice>, and <xs:sequence>

Nessuno di questi aiuta il mio caso in modo soddisfacente.

Qualcuno sa come si dovrebbe convalidare qualcosa di simile.

<Menu>  
   <SubMenu>
      <MenuItem .. />  
      <MenuItem .. />  
      <MenuItem .. />  
   </SubMenu>  
   <MenuItem .. >  
   <MenuItem .. >  
</Menu>

Dove, Sotto il tag <Menu>  <SubMenu> e / o <MenuItem> possono verificarsi qualsiasi numero di volte (0-n) in qualsiasi ordine.  Ma almeno uno di essi deve avvenire almeno una volta.

Ignorando le convalide all'interno tag sottomenu.

apprezzerebbe alcun aiuto in questa materia.

È stato utile?

Soluzione

Se ho capito la vostra esigenza in modo corretto, allora si potrebbe frase il modello come "uno dei sottomenu o MenuItem seguito da zero o più elementi sottomenu o MenuItem". Ciò può essere espresso abbastanza facilmente come una sequenza di due scelte:

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

    <!-- whatever your element needs to be modelled as here -->
    <xs:element name="MenuItem">
        <xs:complexType>
            <xs:attribute name="text"/>
        </xs:complexType>
    </xs:element>

   <!-- only modelling the structure of the child elements here -->
    <xs:element name="SubMenu">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="1" maxOccurs="1">
                    <xs:element ref="MenuItem"/>
                    <xs:element ref="SubMenu"/>
                </xs:choice>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="MenuItem"/>
                    <xs:element ref="SubMenu"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Menu">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="1" maxOccurs="1">
                    <xs:element ref="MenuItem"/>
                    <xs:element ref="SubMenu"/>
                </xs:choice>
                <xs:choice minOccurs="1" maxOccurs="unbounded">
                    <xs:element ref="MenuItem"/>
                    <xs:element ref="SubMenu"/>
                </xs:choice>
            </xs:sequence>          
        </xs:complexType>
    </xs:element>
</xs:schema>

Si potrebbe modellare il modo più pulito utilizzando un tipo globale condivisa per menu e sottomenu, ma in questo modo è relativamente ovvio che la speranza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top