XML schema per costruire “uno o più di questi elementi, ma deve essere almeno un”

StackOverflow https://stackoverflow.com/questions/100228

  •  01-07-2019
  •  | 
  •  

Domanda

Sto cercando di impostare il backup di una parte di uno schema che è come una "Sequenza" in cui tutti gli elementi del bambino sono opzionali, ma almeno uno degli elementi deve essere presenti, e non ci potrebbe essere più di uno di loro.

Ho provato a fare il seguente, ma XMLSpy si lamenta del fatto che "Il modello di contenuto contiene gli elementi <element name="DateConstant"> e <element name="DateConstant"> che non può essere determinato in modo univoco.":

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Questo può essere fatto (e se sì, come)?

Alcuni chiarimenti:Voglio solo per permettere a uno di ogni elemento con lo stesso nome.Non ci può essere una "DateConstant" e/o "TimeConstant", ma non due di entrambi.Gizmo risposta corrisponde alle mie esigenze, ma è poco pratico per un grande numero di elementi.Hurst risposta consente a due o più elementi con lo stesso nome, che io non voglio.

È stato utile?

Soluzione

Prova questo:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Così facendo, si forza a scegliere il primo elemento e poi il resto è optional, il secondo elemento e il resto è optional, il terzo elemento.

Questo dovrebbe fare quello che vuoi, spero.

Naturalmente, si potrebbe inserire il sotto-sequenze in gruppi, per evitare di duplicare un elemento in ogni sequenza se ti rendi conto di perdere uno.

Altri suggerimenti

Secondo l'articolo tecnico su MSDN intitolato Conoscenza di XML Schema a http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 si può prendere vantaggio di vincoli come minOccurs la scelta di definizione (compositore) stessa:

"Utilizzo di vincoli di occorrenza di un compositore si applica a tutto il gruppo come un tutto"

(Vedere l'esempio più complesso che utilizza nidificato tipi complessi e la AuthorType esempio)

Hai dichiarato che il tuo requisito di "almeno uno degli elementi che devono essere presenti, e ci potrebbero essere più di uno di loro".Quindi, vi propongo di provare il seguente:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@hurst,

Purtroppo non sei riuscito a capire la domanda originale.Immissione minOccurs="1" la scelta è soddisfatto automaticamente quando TUTTI gli elementi che hanno minOccurs="0" contenuti come opzioni.

Così si hanno non è riuscito a spiegare il "almeno uno" necessari per il poster originale, perché non correttamente gli elementi soddisfa 1 occurrance di due elementi facoltativi.

Finora sono riuscito a trovare una soluzione a questo come minOccur/maxOccur entrambe riguardano il gruppo in cui sono definiti e NON si riferiscono ad un numero complessivo di nodi.Né è possibile utilizzare l'elemento di scelta per definire lo stesso nome elemento più di una volta o si diventa "ambiguo".Ho visto alcuni esempi di utilizzare riferimenti invece di elementi di un tipo specifico, ma credo che questo non riesce microsoft XSD parser.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Qui si può vedere che è la prima sequenza (che DEVE avere Elem1, ma può avere Elem2 facoltativamente), o si ha la seconda sequenza (che DEVE avere Elem2).

Quindi ora ha "uno o più" di questi 2 elementi.Naturalmente, questo diventa esponenzialmente più complesso, più opzioni ci sono e come, che è necessario fornire ulteriori scelte per tutte le possibili combinazioni.

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