Domanda

sto cercando di rappresentare il seguente frammento di DTD in XSD: -

(A | B) * | (A | C) * | (A | D) * | ...

vale a dire. una lista mista di qualsiasi numero di As e qualsiasi numero di una di B, C, D, ...

CastorConverter sputa fuori: -

              <choice>
                    <choice minOccurs="0" maxOccurs="unbounded">
                          <element ref="tns:A" />
                          <element ref="tns:B" />
                    </choice>
                    <choice minOccurs="0" maxOccurs="unbounded">
                          <element ref="tns:A" />
                          <element ref="tns:C" />
                    </choice>
                    <choice minOccurs="0" maxOccurs="unbounded">
                          <element ref="tns:A" />
                          <element ref="tns:D" />
                    </choice>
              </choice>

ma questo mi dà un errore del parser. Indagare con Visual Studio porta in primo piano il seguente avviso: -

"Multiple definizione dell'elemento 'A' provoca il modello di contenuto diventi ambiguo. Un modello contenuto deve essere formato in modo tale che durante la convalida di una sequenza item informazione dell'elemento, la particella conteneva direttamente, indirettamente o implicitamente ivi con cui tentare di validare ogni elemento della sequenza a sua volta può essere determinata univocamente senza esaminare il contenuto o attributi di tale elemento, e senza alcuna informazione circa le voci del resto della sequenza. "

Il problema sembra essere che se il parser incontra una "A" avrà bisogno di "look-ahead" per il resto della sequenza al fine di determinare quale scelta per convalidare contro.

C'è un altro modo per rappresentare questa sequenza in XSD?

È stato utile?

Soluzione

Usare sequenze, in questo modo:

<sequence minOccurs="0">
  <element minOccurs="0" maxOccurs="unbounded" ref="tns:A" />
  <choice>
    <sequence>
      <element minOccurs="1" maxOccurs="unbounded" ref="tns:B" />
      <sequence minOccurs="0" maxOccurs="unbounded">
        <element maxOccurs="unbounded" ref="tns:A" />
        <element minOccurs="0" maxOccurs="unbounded" ref="tns:B" />
      </sequence>
    </sequence>
    <sequence>
      <element minOccurs="1" maxOccurs="unbounded" ref="tns:C" />
      <sequence minOccurs="0" maxOccurs="unbounded">
        <element maxOccurs="unbounded" ref="tns:A" />
        <element minOccurs="0" maxOccurs="unbounded" ref="tns:C" />
      </sequence>
    </sequence>
    <sequence>
      <element minOccurs="1" maxOccurs="unbounded" ref="tns:D" />
      <sequence minOccurs="0" maxOccurs="unbounded">
        <element maxOccurs="unbounded" ref="tns:A" />
        <element minOccurs="0" maxOccurs="unbounded" ref="tns:D" />
      </sequence>
    </sequence>
  </choice>
</sequence>

alt text http://www.freeimagehosting.net/uploads/29c07bafa2.png

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