Announcement

Collapse
No announcement yet.

Sequenz und eingeschränkte Häufigkeit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sequenz und eingeschränkte Häufigkeit

    Hallo,
    mein Problem ist folgendes: ich möchte definieren, dass in einen Buchteil am Anfang ein Titel, danach evtl. eine Auswahl möglicher Blockelemente und zum Schluß evtl. ein oder mehrere Kapitel folgen. Leider kenne ich mich mit XML Schema nicht gut genug aus und weiß nicht, ob und wie dies darstellbar ist.

    Hier mal mein Versuch:
    Code:
    <xs:element name="teil">
    		<xs:complexType>
    			<xs:choice>
    				<xs:sequence>
    					<xs:element ref="titel"/>
    					<xs:sequence minOccurs="0" maxOccurs="unbounded">
    						<xs:choice>
    							<xs:element ref="absatz"/>
    							<xs:element ref="liste"/>
    							<xs:element ref="tabelle"/>
    							
    						</xs:choice>
    					</xs:sequence>
    					<xs:element ref="kapitel" minOccurs="0" maxOccurs="unbounded"/>
    				</xs:sequence>
    			</xs:choice>
    		</xs:complexType>
    	</xs:element>
    Mit diesem Schema ist es aber möglich, dass der Titel ohne Blockelemente bzw. Kapitel ausgegeben wird. Das soll nicht so sein. Also entweder sollen nach dem Titel mind. 1 Blockement oder mind. 1 Kapitel folgen. Wie kann man das ausdrücken.

    Ich bin für Hinweise sehr dankbar und hoffe, dass mir jemand helfen kann.

  • #2
    Code:
    <xs:element name="teil">
      <xs:complexType>
        <xs:sequence>
          <xs:element ref="titel"/>
          <xs:choice minOccurs="1">
            <xs:element ref="absatz"/>
            <xs:element ref="liste"/>
            <xs:element ref="tabelle"/>
          </xs:choice>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    Zuerst kommt eine Sequenz, in der bestimmt wird, dass nach dem Titel etwas folgen muss. Danach kommt eine Choice mit minOccurs="1", das bestimmt, dass absatz/liste/tabelle mindestens 1x folgen muss.

    Comment


    • #3
      Vielen Dank.
      Aber wie drücke ich denn aus, dass entweder nach dem Titel mind. 1 Blockement oder mind. 1 Kapitel folgen?

      Also folgende Varianten sollen alle möglich sein:

      Code:
      <teil>
      	<titel>aaa</titel>
      	<absatz></absatz>
      	<absatz></absatz>
      	<chapter></chapter>
      	<chapter></chapter>
      	<chapter></chapter>
      </teil>
      Code:
      <teil>
      	<titel>aaa</titel>
      	<chapter></chapter>
      	<chapter></chapter>
      	<chapter></chapter>
      </teil>
      Code:
      <teil>
      	<titel>aaa</titel>
      	<absatz></absatz>
      	<liste></liste>
      	<tabelle></tabelle>
      </teil>
      Nachdem <chapter> gewählt wurde, sollen keine Blockelemente mehr möglich sein.

      Comment


      • #4
        Also, zuerst mal: Eine Sequenz erwartet, dass alle Elemente der Reihenfolge nach aufgeführt werden.

        Als einfaches Beispiel würde nun mit
        Code:
        <xs:element name="teil">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="titel"/>
              <xs:element name="absatz"/>
              <xs:element name="chapter"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        folgendes XML-Dokument erwartet werden:
        Code:
        <teil>
          <titel>beispieltext</titel>
          <absatz>beispieltext</absatz>
          <chapter>beispieltext</chapter>
        </teil>
        Die Sequenz verlangt zum Einen, dass alle Elemente vorkommen und zum Anderen, dass sie die korrekte Reihenfolge einhalten.

        Jetzt möchtest Du aber nach dem Titel eine Auswahl haben, dafür gibts eben die Choice. Als einfaches Beispiel würde nun mit
        Code:
        <xs:choice minOccurs="1">
          <xs:element name="absatz"/>
          <xs:element name="liste"/>
          <xs:element name="tabelle"/>
        </xs:choice>
        nun erwartet werden, dass entweder ein Element "absatz", ein Element "liste" oder ein Element "tabelle" vorkommen. Das "minOccurs='1'"-Attribut verlangt eben, dass eines dieser Elemente mindestens einmal vorkommt, "minOccurs='2'" würde bedeuten, dass mindestens 2 Elemente vorkommen müssen, etc.

        Mit "minOccurs='0'" und "maxOccurs='unbounded'" kannst Du angeben, dass ein Element nicht zwangsläufig vorkommen muss, aber beliebig oft angegeben werden kann.
        Zusammengesetzt würde das also für Dich bedeuten:
        Code:
        <xs:element name="teil">
          <xs:complexType>
            <xs:sequence minOccurs="1">
              <xs:element ref="titel"/>
              <xs:choice minOccurs="1" maxOccurs="1">
                <xs:sequence>
                  <xs:choice maxOccurs="unbounded">
                    <xs:element ref="absatz"/>
                    <xs:element ref="liste"/>
                    <xs:element ref="tabelle"/>
                  </xs:choice>
                  <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="chapter"/>
                  </xs:choice>
                </xs:sequence>
                <xs:choice maxOccurs="unbounded">
                  <xs:element ref="chapter"/>
                </xs:choice>
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        Was passiert hier nun genau? Ganz einfach: Zuerst startet die erste Sequenz, in der nach dem Titel entweder eine Blockelement-Sequenz oder aber ein Kapitel kommen muss. Innerhalb der Blockelement-Sequenz muss zuerst absatz/liste/tabelle in beliebiger Anzahl und Reihenfolge kommen, danach dürfen Kapitel kommen. Wurde aber ein Kapitel eingefügt, dürfen nur noch Kapitel folgen.

        Ist das so, wie Du Dir das vorgestellt hast? Oft muss man einfach ein Bisschen rumprobieren, dann bringt mans schon irgendwie hin.

        Ich würd übrigens Element-Namen gross schreiben, dann heben sie sich besser vom Gesamtdokument ab. Also als Beispiel "Titel" statt "titel", etc (es sei denn, Deine Anforderungen lauten so, dass die Elementnamen klein sein müssen).

        Comment


        • #5
          DANKE! Genau so habe ich es mir vorgestellt
          Vielen, vielen Dank!!!

          Comment

          Working...
          X