Thoin: XSD: Uneindeutigkeit bei (a OR b OR (a AND b))?

Hallo Forum,

als Newbie auf dem Gebiet XSD komme ich an einer Stelle nicht weiter, trotz Suche in der Selfhtml-Doku und Fragen an mir bekannte XML-Cracks.

Ich habe 3 Elemente definiert, a, b und c. Diese will ich im XML-File in folgender Form zulassen:

a
OR
b
OR
a AND b

Mein Versuch:

  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">  
 <xs:element name="a"/>  
 <xs:element name="b"/>  
 <xs:element name="base">  
  <xs:complexType>  
   <xs:choice>  
    <xs:element ref="a"/>  
    <xs:element ref="b"/>  
    <xs:sequence>  
     <xs:element ref="a"/>  
     <xs:element ref="b"/>  
    </xs:sequence>  
   </xs:choice>  
  </xs:complexType>  
 </xs:element>  
</xs:schema>  

Mein Validierer bemäkelt Nicht-Determinismus wg. Namensgleichheit zwischen den zweifach auftretenden Elementen a bzw. b im xs:choice-Block (jedenfalls verstehe ich das so).

Noch glaube ich aber, dass es möglich sein muss, so etwas in einer XSD zu definieren - nur wie?

Bin für alle Hints dankbar ...

thoin

  1. Nachtrag:

    Vielleicht zum besseren Verständnis meines Problems: Da ein choice-Block nach meinem Verständnis immer nur eines seiner Inhaltselemente zulässt, kann ich hier keine Mehrdeutigkeit erkennen.

    thoin

  2. hi!

    Ich habe 3 Elemente definiert, a, b und c. Diese will ich im XML-File in
    folgender Form zulassen:
    a
    OR
    b
    OR
    a AND b

    "a OR b" deckt "a AND b" aussagenlogisch schon mit ab, vielleicht haengt es
    damit zusammen?

    bye, Frank!

    --
    Never argue with an idiot. He will lower you to his level and then
    beat you with experience.
    1. hi!

      Ich habe 3 Elemente definiert, a, b und c. Diese will ich im XML-File in
      folgender Form zulassen:
      a
      OR
      b
      OR
      a AND b

      "a OR b" deckt "a AND b" aussagenlogisch schon mit ab, vielleicht haengt es
      damit zusammen?

      Don't think so. Gemeint ist nicht (a OR b) OR (a AND b), sondern (a) OR (b) OR (a AND b)), also

      Fall 1: a

      Fall 2: b

      Fall 3: a UND b

      thoin

      1. hi!

        "a OR b" deckt "a AND b" aussagenlogisch schon mit ab, vielleicht
        haengt es damit zusammen?
        Don't think so. Gemeint ist nicht (a OR b) OR (a AND b), sondern (a) OR
        (b) OR (a AND b)), also

        Das waer dann aber eher ein XOR, oder? Ich glaube, dann hat das Problem was
        mit dem Typ der formalen Grammatik zu tun. Aber dafuer ist meine TheoInf-
        Vorlesung inzwischen zu lange her ... ;)

        Ich vermute, so aehnlich koennte es funktionieren, um das auszudruecken,
        was du moechtest:

          
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">  
         <xs:element name="a"/>  
         <xs:element name="b"/>  
         <xs:element name="base">  
          <xs:complexType>  
           <xs:choice>  
            <xs:sequence>  
              <xs:element ref="a"/>  
              <xs:element ref="b" maxOccurs="1"/>  
            </xs:sequence>  
            <xs:element ref="b"/>  
           </xs:choice>  
          </xs:complexType>  
         </xs:element>  
        </xs:schema>  
        
        

        bye, Frank!

        --
        Never argue with an idiot. He will lower you to his level and then
        beat you with experience.
        1. /snip

          Don't think so. Gemeint ist nicht (a OR b) OR (a AND b), sondern (a) OR
          (b) OR (a AND b)), also

          Das waer dann aber eher ein XOR, oder? Ich glaube, dann hat das Problem was
          mit dem Typ der formalen Grammatik zu tun. Aber dafuer ist meine TheoInf-
          Vorlesung inzwischen zu lange her ... ;)

          Ich vermute, so aehnlich koennte es funktionieren, um das auszudruecken,
          was du moechtest:

          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
          <xs:element name="a"/>
          <xs:element name="b"/>
          <xs:element name="base">
            xs:complexType
             xs:choice
              xs:sequence
                <xs:element ref="a"/>
                <xs:element ref="b" maxOccurs="1"/>
              </xs:sequence>
              <xs:element ref="b"/>
             </xs:choice>
            </xs:complexType>
          </xs:element>
          </xs:schema>

            
          Nee, leider auch nicht. In diesem Fall muss mindestens b vorhanden sein, a alleine geht nicht. Ich brauche: entweder nur a, oder nur b, oder beide gleichzeitig. Eigentlich ist es ein stinknormales OR, das ich will, aber ich hake an der Mehrdeutigkeit, die ich nicht sehe (im Gegensatz zum Validierer).  
            
          Soweit ich weiss, ist maxOccurs immer 1, wenn man nichts anderes dazuschreibt, insofern ist das ohne Auswirkung.  
            
          Trotzdem danke!  
            
          thoin
          
  3. Hallo thoin,

    a
    OR
    b
    OR
    a AND b

    Nahe kommt dem dieser Ansatz, wobei allerdings auch beide Kindelemente gleichzeitig fehlen dürfen:

    <xs:element name="base">  
      <xs:complexType>  
        <xs:sequence>  
          <xs:element ref="a" minOccurs="0" maxOccurs="1"/>  
          <xs:element ref="b" minOccurs="0" maxOccurs="1"/>  
        </xs:sequence>  
      </xs:complexType>  
    </xs:element>
    

    Grüße,
    Thomas

    1. Hallo thoin,

      a
      OR
      b
      OR
      a AND b

      Nahe kommt dem dieser Ansatz, wobei allerdings auch beide Kindelemente gleichzeitig fehlen dürfen:

      <xs:element name="base">

      xs:complexType
          xs:sequence
            <xs:element ref="a" minOccurs="0" maxOccurs="1"/>
            <xs:element ref="b" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

      
      >   
      
      /snip  
        
      Ja, das ist auch mein Problem: Ich komme der Lösung immer nur nahe, aber ganz erreichen tu ich sie nicht. Aber ich kann mir nicht vorstellen, dass das nicht gehen sollte. Eigentlich ist das doch nichts ungewöhnliches - aussagenlogisch ist das doch nur ein ganz normales OR. \*sigh\*  
        
      Danke.  
        
      thoin
      
      1. Hallo

        Hallo thoin,

        a
        OR
        b
        OR
        a AND b

        Ja, das ist auch mein Problem: Ich komme der Lösung immer nur nahe, aber ganz erreichen tu ich sie nicht. Aber ich kann mir nicht vorstellen, dass das nicht gehen sollte. Eigentlich ist das doch nichts ungewöhnliches - aussagenlogisch ist das doch nur ein ganz normales OR. *sigh*

        Aussagenlogisch ist das, wie Frank Dir bereits geschrieben hat, ganz einfach

        a OR b

        Dies kannst Du selbstverständlich auch komplizierter schreiben:

        a
        OR
        b
        OR
        a AND b

        oder

        (a AND NOT b)
        OR
        (NOT a AND b)
        OR
        (a AND b)

        oder

        NOT (NOT a AND NOT b)

        Schauen wir uns die Verknüpfungstabellen an (ich benutze ! als Abkürzung für NOT)

        a | b | !a | !b | a OR b | a OR b OR (a AND b) | !(!a AND !b)
        --------------------------------------------------------------
        0 | 0 |  1 |  1 |   0    |         0           |       0
        0 | 1 |  1 |  0 |   1    |         1           |       1
        1 | 0 |  0 |  1 |   1    |         1           |       1
        1 | 1 |  1 |  1 |   1    |         1           |       1

        1           2         3
        a | b | !a | !b | a AND !b | !a AND b | a AND b | 1 OR 2 OR 3
        ---------------------------------------------------------------
        0 | 0 |  1 |  1 |    0     |    0     |    0    |      0
        0 | 1 |  1 |  0 |    0     |    1     |    0    |      1
        1 | 0 |  0 |  1 |    1     |    0     |    0    |      1
        1 | 1 |  1 |  1 |    0     |    0     |    1    |      1

        Wenn Du drei disjunkte Fälle benötigst, könnte Dir vielleicht letzteres Konstrukt helfen.

        Freundliche Grüße

        Vinzenz

        1. /snip

          Aussagenlogisch ist das, wie Frank Dir bereits geschrieben hat, ganz einfach

          a OR b

          /snip

          Schauen wir uns die Verknüpfungstabellen an (ich benutze ! als Abkürzung für NOT)

          a | b | !a | !b | a OR b | a OR b OR (a AND b) | !(!a AND !b)

          0 | 0 |  1 |  1 |   0    |         0           |       0
          0 | 1 |  1 |  0 |   1    |         1           |       1
          1 | 0 |  0 |  1 |   1    |         1           |       1
          1 | 1 |  1 |  1 |   1    |         1           |       1

          /snip

          Ja, ich gebe zu, ich habe mein Posting nicht präzise genug formuliert. Inzwischen (dank der Diskussion und Eurer Antworten) habe ich auch gemerkt, dass sich mein Ziel auch mit (a OR b) ausdrücken lässt. Aber es hat ja nichts mit XOR zu tun, wie Frank vorschlug.

          Nichtsdestotrotz, was mich ja eigentlich interessiert: Hat jemand eine Idee, wie man das in einer XSD genau so (letzte 3 Spalten Deiner Verknüpfungstabelle) formuliert?

          thoin

  4. Hi,

    nachdem ich schließlich doch noch selbst auf den Trichter gekommen bin, möchte ich Euch doch noch an der Weisheit teilhaben lassen ;-) :

    Der Ausdruck

    a OR b

    (identisch mit dem von mir gschriebenen a OR b OR (a AND b))

    wird in der XSD einfach dargestellt durch

      
    <xs:choice maxOccurs="2">  
     <xs:element ref="a"/>  
     <xs:element ref="b"/>  
    </xs:choice>  
    
    

    Durch das maxOccurs="2" und das implizite minOccurs="1" beim xs:choice wird angegeben, dass mindestens ein Element (a oder b) und höchstens 2 Elemenente (a und b) angegeben werden müssen.

    Danke nochmal an alle Mitdiskutanten.

    thoin

    1. Hi,

      <xs:choice maxOccurs="2">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
      </xs:choice>

        
      das erlaubt m.E. a, aa, ab, b, ba, bb  
        
      
      > Durch das maxOccurs="2" und das implizite minOccurs="1" beim xs:choice wird angegeben, dass mindestens ein Element (a oder b) und höchstens 2 Elemenente (a und b) angegeben werden müssen.  
        
      M.E. wird damit erreicht, daß ein oder zweimal die Wahl zwischen a und b getroffen werden darf - und dabei wird nicht ausgeschlossen, daß beide Male dieselbe Wahl getroffen wird.  
        
      cu,  
      Andreas
      
      -- 
      [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
      [O o ostern ...](http://ostereier.andreas-waechter.de/)  
        
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
      
      
      1. /snip

        das erlaubt m.E. a, aa, ab, b, ba, bb

        /snip

        M.E. wird damit erreicht, daß ein oder zweimal die Wahl zwischen a und b getroffen werden darf - und dabei wird nicht ausgeschlossen, daß beide Male dieselbe Wahl getroffen wird.

        Stimmt.

        Mist.

        Bessere Idee? Oder kann man das wirklich nicht in XSD darstellen? Ich mags nicht glauben, aber bislang hat noch jeder davor kapituliert ...

        thoin

        1. Hi,

          das erlaubt m.E. a, aa, ab, b, ba, bb
          Bessere Idee? Oder kann man das wirklich nicht in XSD darstellen? Ich mags nicht glauben, aber bislang hat noch jeder davor kapituliert ...

          Was genau soll denn erlaubt sein?

          a
          b
          ab

          oder

          a
          b
          ab
          ba

          ?

          (Meiner Meinung nach sind aussagenlogische Angaben wie A and B or C ungeeignet, um derartige Zusammenhänge darzustellen (weil A and B und B and A aussagenlogisch identisch ist 1), <A/><B/> und <B/></A> aber nicht identisch)

          Im ersten Fall: entweder a evtl. gefolgt von b oder b

          Im zweiten Fall: entweder a evtl. gefolgt von b  oder  b evtl. gefolgt von a

          Entweder-oder: choice
          evtl.: min-occurs 0, max-occurs 1
          gefolgt von: sequence.

          also: choice( sequence(a, b[min:0, max:1]), b)
          bzw. choice( sequence(a, b[min:0, max:1]), sequence(b, a[min:0, max:1]))

          1. "and" im logischen Sinn, nicht in dem Sinn, wie es als shortcut operator in Programmiersprachen verwendet wird.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Moin,

            ich möchte aussagenlogisch darstellen

            (a) OR (b) OR (a AND b),

            also der entsprechende Datenzweig darf nicht leer sein im XML: es muss entweder ein a oder ein b enthalten, aber es kann auch beide (a und b) enthalten. Dabei ist es egal, ob es <a/> <b/> oder <b/> <a/> ist. Notfalls kann ich hier auch mit einer geforderten Reigenfolge leben.

            Im ersten Fall: entweder a evtl. gefolgt von b oder b

            Im zweiten Fall: entweder a evtl. gefolgt von b  oder  b evtl. gefolgt von a

            Entweder-oder: choice
            evtl.: min-occurs 0, max-occurs 1
            gefolgt von: sequence.

            also: choice( sequence(a, b[min:0, max:1]), b)
            bzw. choice( sequence(a, b[min:0, max:1]), sequence(b, a[min:0, max:1]))

            In beiden Fällen kann das Konstrukt nicht validiert werden, wenn im choice ein Element zweimal auftritt.

            Ich hatte eine Lösung, die so aussah:

              
            <xs:choice>  
             <xs:element ref="a"/>  
             <xs:element ref="b"/>  
             <xs:sequence>  
              <xs:element ref="a"/>  
              <xs:element ref="b"/>  
             </xs:sequence>  
            </xs:choice>  
            
            

            Leider lässt sich die auch nicht validieren, mit dem gleichen Problem wie bei Deiner Lösung: wg. des mehrfachen Auftretens von a und b gibt es offensichtlich Mehrdeutigkeiten - was mir nicht klar ist, weil das choice doch nur EIN Element zulässt. (Abgesehen davon ist mir auch nicht klar, warum es nicht mehrere Instanzen von z.B. a geben sollte - aber ich vermute, ich habe da ein Konzept in XML / XSD noch nicht richtig begriffen ...

            thoin