XSD: Uneindeutigkeit bei (a OR b OR (a AND b))?
Thoin
- xml
0 Thoin1 Frank Schönmann0 thoin0 Frank Schönmann0 Thoin
0 ThomasM0 Thoin0 Vinzenz Mai0 Thoin
1 Thoin
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
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
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!
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
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!
/snip
Don't think so. Gemeint ist nicht (a OR b) OR (a AND b), sondern (a) OR
(b) OR (a AND b)), alsoDas 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
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
Hallo thoin,
a
OR
b
OR
a AND bNahe 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
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
/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
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
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.
/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
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]))
cu,
Andreas
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