2010-11-08 13 views
9

Credo che questo abbia a che fare con keyref ma non sono sicuro, e non sono affatto sicuro che possa essere fatto.Restrizione di elementi XML basati su un altro elemento tramite XSD

Ad esempio, supponiamo di avere myElement1 e myElement2. Se non ci sono myElement2 nel file XML, allora myElement1 deve esistere, altrimenti è opzionale.

C'è un modo per forzare questo tipo di convalida nel mio file XSD?

+1

Sono sicuro che la risposta non è a causa dell'ambiguità: lo schema per il contenitore di tali elementi avrebbe due definizioni diverse. L'unica soluzione è dichiarare facoltativo l'elemento "opzionale/obbligatorio" e utilizzare una convalida della seconda fase. –

risposta

23

Domande simili sono state poste diverse volte .. in StackOverflow o qualsiasi blog tecnologici ..

ma la risposta è sempre non è possibile,


casi come:

(un) Elemento di convalida in base al valore o alla presenza di qualsiasi altro elemento/attributo
(b) valore di convalida di un elemento in base al valore o alla presenza di qualsiasi altro elemento/attributo
(c) convalida attributo seconda del valore o la presenza di qualsiasi altro elemento/attributo
(d) definente elementi/attributi stesso nome aventi differenti tipi/DataTypes sotto stesso ambito
(e) convalida elementi figlio sulla base di valore o la presenza di eventuali altri elementi/attributi

tutti i casi di cui sopra non sono possibili per raggiungere ..

ma se è possibile implementare una cosa trasformazione .. allora si può ottenere aiuto. quello che intendo dire è "prima passare attraverso la trasformazione e modificare l'XML secondo il tuo fabbisogno,

esempio: se il particolare campo è previsto con un certo valore .. passa l'XML così com'è se la condizione è soddisfatta e non passare se non lo fa .. nel prossimo blocco XSD sta per convalidare e ovviamente errori out :) puoi capire che manca la tua convalida personalizzata ..

comunque l'intenzione è quella di blocco o Passa l'xml secondo i dati .. ed è quello che stai facendo ..

Nota: Schematron è diventato di recente una buona pratica! Ecco il tutorial: http://zvon.org/xxl/SchematronTutorial/General/contents.html

+0

Grazie per le informazioni! Ho cercato prima di pubblicare ma non ho potuto trovare una risposta. Fondamentalmente, ho scoperto che è impossibile fare solo con la validazione e lo schema. – hmcclungiii

+0

@hmcclungiii, ecco il punto :) –

+1

Questa è una parafrasi ragionevolmente ma non completamente accurata della situazione in XSD 1.0: i casi (a), (b), (e) e (f) sono talvolta possibili, a seconda di i dettagli del vincolo desiderato. E in XSD 1.1 le caratteristiche di tipo condizionale e di asserzione rendono espressiva una gamma di vincoli piuttosto ampia. –

1

Quello che vorrei suggerire è quello di creare XSD per ogni casi definiti di seguito:

casi come:

  1. Convalida Elemento a seconda del valore o la presenza di qualsiasi altro elemento/attributo.
  2. Convalida il valore di un elemento in base al valore o alla presenza di qualsiasi altro elemento/attributo.
  3. Convalida dell'attributo in base al valore o alla presenza di qualsiasi altro elemento/attributo.
  4. Ignorare elementi (casuali)/attributi dalla convalida non è consentito. (Voglio dire, l'uso di ha delle restrizioni.
  5. Elementi/attributi con lo stesso nome con tipi di dati diversi.
  6. Convalida elementi figlio in base al valore o alla presenza di altri Elementi/Attributi.

E creare lì proprio XML per quello.

Problemi correlati