2010-10-11 20 views
6

Sto cercando una variante di scelta di un attributo per un elemento, che può essere impostato direttamente o essere referenziato.Scelta degli attributi sull'istanza XML per attributi o riferimenti definiti direttamente

questo è quello che ho in mente:

<root>  
<element> 
    <attribute ref="shortname" /> 
</element> 
<element> 
    <attribute name="shortname" isEditable="true" anotherattrib="0815" /> 
</element> 
</root> 

Dal momento che questo non sarebbe problema senza uno schema XML, la definizione di questo attributo è abbastanza difficile se l'attributo "nome" di un attributo elemento è richiesto.

lo schema potrebbe essere il seguente

<xs:element name="attribute"> 
<xs:complexType> 
<xs:attribute name="ref" use="required" /> 
<xs:attribute name="name" use="required" /> 
</xs:complexType> 
</xs:element> 

C'è la possibilità di fare una scelta (simile ad un xs: scelta per gli elementi) tra gli attributi? Come se ci fosse un attributo dall'attributo elemento denominato ref, non sono ammessi altri attributi. in caso contrario, l'attributo "nome" deve essere impostato ...

Questo problema sembra puro virtuale e accademico, ma sarei felice se ci fosse una soluzione o se ho completamente torto con quello che ho in mente:)

Grazie in anticipo per qualsiasi aiuto!

Dave

risposta

1

Mi sembra che sia impossibile definire XML Schema, come si desidera. O è necessario definire due diversi nomi elemento come <attribute> e <attributeRef> con il diverso insieme di attributi obbligatori o è necessario definire né "ref""name" attributo come "required".

XML Lo schema non è l'unico modo per verificare i dati e non è possibile definire alcuni ruoli tra i valori degli attributi rispetto a XML Schema. Quindi, se si ha bisogno di verificare rapporto più complesso in un documento XML è possibile utilizzare XPath e XSLT per fare questo (vedi Schematron, XML Schema Language Comparison, Beyond W3C XML Schema, Improving XML Document Validation with Schematron, Advanced XML validation e Using XSL as a Validation Language).

+0

Penso che l'unico modo per esprimere ciò sarebbe: dichiarare un tipo complesso con contenuto completo, dichiarare due tipi di derivazione con restrizione, quando si dichiara che il contenuto principale utilizza una scelta. –

+0

@ Alejandro: Nel modo in cui puoi dichiarare due tipi. Non è un problema, ma come è possibile definire una scelta con due elementi con ** lo stesso nome ** "" e tipo diverso? Non sono sicuro che sarà possibile. Mi sembra che tu riceva l'errore che la definizione dell'elemento "" sia ambigua. – Oleg

+0

@Oleg: la scelta è tra due elementi (ciascuno con un tipo derivato distinto) ma lo stesso nome, ** nella dichiarazione padre **, ad esempio: complexType denominato 'Base'; complexType denominato 'BaseA' derivato da' Base' con restrizioni; lo stesso per complexType chiamato 'BaseB'; element name 'Parent' con una scelta tra un elemento chiamato' Child' con 'BaseA' o un elemento chiamato' Child' con 'BaseB'. –

0

Questo può essere realizzato con XML Schema 1.1 asserzioni:

<xsd:complexType name="AttributeType"> 
    <xsd:sequence /> 
    <xsd:attribute name="ref" type="xsd:string" /> 
    <xsd:attribute name="name" type="xsd:string" /> 
    <xsd:assert test="count(@ref | @name) = 1" /> 
</xsd:complexType> 

L'elemento assert assicura che soltanto uno dei ref e name vengono utilizzati.

Problemi correlati