Per mi l’è istess: ossia XML uno a l’altro elemento obbligatori

Un veloce appunto sui trucchi del mestiere (quale? su questo bisognerebbe aprire un post a parte): a volte capita creando uno Schema XML di dover specificare che o l’elemento A o l’elemento B siano obbligatori (è necessario indicarne uno dei due), ma non esclusivi (possono esserci entrambi).

Un esempio? Capita che ci siano pergamene senza titolo o, meglio, il cui titolo è in realtà la descrizione. Sicché se io ho i due elementi title e description (dublin core docet) potrei richiedere che uno dei due sia presente obbligatoriamente, ma che possano esserci tutte e due insieme.

Come fare con XML Schema senza tirare in ballo Schematron e aggeggi simili?

Beh mi direte che si può partire con una scelta fra i due, del tipo:

<xsd:choice>
    <xsd:element ref="title"/>
    <xsd:element ref="description"/>
</xsd:choice>

Ma questo implica che o usiamo l’uno o l’altro e noi vogliamo poter usare entrambi. Allora potreste pensare di cavarvela reiterando la scelta:

<xsd:choice maxOccurs="2">
    <xsd:element ref="title"/>
    <xsd:element ref="description"/>
</xsd:choice>

È una buona idea, ma scritta così ci permette sia di avere title+description (che è quello che vogliamo), ma anche due title o due description.

Per ovviare a questo usiamo un trucco, con l’elemento unique. Unique in realtà servirebbe a dire che il contenuto di un elemento deve essere unico, ma noi la possiamo usare anche per controllare che l’elemento stesso (non il suo contenuto) sia univoco:

<xsd:unique name="uniqueTitle"> 
     <xsd:selector xpath="."/> 
     <xsd:field xpath="title"/> 
</xsd:unique> 
<xsd:unique name="uniqueDesc"> 
     <xsd:selector xpath="."/> 
     <xsd:field xpath="description"/> 
</xsd:unique> 

Notare che questo è un effetto collaterale di unique ed è possibile che l’errore indicato dai validatori non sia propriamente coerente.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...