È valido avere una "scelta" di elementi "gruppo" quando si definisce uno schema XML (XSD)

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

  •  01-07-2019
  •  | 
  •  

Domanda

È valido avere elementi "scelta" o "gruppo" quando si definisce uno schema XML (XSD)

cioè.è valido il seguente

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Dove un messaggio XML può rappresentare, ad esempio, sia una nuova prenotazione sia la cancellazione di una prenotazione esistente.

Se il messaggio riguarda una prenotazione, deve includere tutti gli elementi definiti nel gruppo PrenotazioneGruppo.

Se si tratta di una cancellazione, deve includere tutti gli elementi definiti nel gruppo CancellationGroup.

Per qualche motivo, al mio editor XML (Eclipse) questo non piace, ma non indica il motivo.Mostra che c'è un errore sulla riga <xs:complexType name="HeaderType"> ma non dice quale sia l'errore

È stato utile?

Soluzione

Non sono un esperto di XML, anche se lo uso parecchio.Questo non è il modo in cui generalmente realizzerei questo tipo di struttura.Preferirei tipi complessi separati piuttosto che una scelta di due gruppi (vedi la fine di questa risposta).

Ho il sospetto che il problema sia che BookingGroup e CancellationGroup iniziano con lo stesso elemento, nel qual caso violerai il vincolo del componente dello schema:Attribuzione unica delle particelle (sotto).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

Vincolo del componente dello schema:Attribuzione unica delle particelle

Un modello di contenuto deve essere formato in modo tale che durante · convalida · di una sequenza di elementi di informazione dell'elemento, il componente delle particelle contenuto direttamente, indirettamente o · implicitamente · in esso con cui tentare di convalidare · ogni elemento nella sequenza a sua volta può essere determinato in modo univoco senza esaminare il contenuto o gli attributi di tale elemento e senza alcuna informazione sugli elementi nel resto della sequenza.

Nota: Questo vincolo ricostruisce per lo schema XML i vincoli equivalenti di [XML 1.0 (seconda edizione)] e SGML.Data la presenza di gruppi di sostituzione degli elementi e caratteri jolly, l'espressione concisa di questo vincolo è difficile, vedere l'analisi dell'esclusivo vincolo di attribuzione delle particelle (non normali) (§H) per ulteriori discussioni.

Ad esempio, i due gruppi seguenti sono illegali nella stessa scelta, perché ciascuno dei loro primi elementi è "nome", il che significa che non è possibile identificare quale gruppo si sta guardando.Tuttavia è il primo elemento di prenotazione è diverso dal gruppo di cancellazione (forse Resdate e Cancdate), quindi che è valido.

Modificare: Non mi ero mai imbattuto in questo tipo di problema prima, e penso che sia affascinante il fatto che le definizioni dei gruppi siano totalmente legali, ma se le metti insieme in una scelta, quella scelta diventa illegale a causa della definizione di ciascun gruppo.

Gruppi che non possono formare una scelta giuridica

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Gruppi che possono costituire una scelta giuridica

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Come ho detto sopra, farei questo genere di cose con tipi complessi.Sì, aggiunge un altro elemento, ma sembra il modo più ovvio e a me piace l'ovvietà.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Altri suggerimenti

SÌ.Ciò era dovuto al fatto che sia PrenotationGroup che CancellationGroup avevano lo stesso primo elemento: un elemento "tipo prenotazione" con un valore fisso rispettivamente di "Prenotazione" in PrenotationGroup e "Cancellazione" in Cancellationgroup.

La validità dipende dal contenuto dei gruppi:se sono gruppi modello "sequenza" o "scelta", è perfettamente legale;"tutti" i gruppi di modelli sono più problematici e generalmente non sono consentiti in questo caso.

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