I have the following XML Schema (sorry that it's so long, but I stripped it down already!): <?xml version = "1.0" encoding = "ISO-8859-1"?> <!--Generated by XML Authority. Conforms to w3c http://www.w3.org/2001/XMLSchema--> <xsd:schema xmlns = "http://www.congenio.de/schema/BankingRequest" targetNamespace = "http://www.congenio.de/schema/BankingRequest" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" elementFormDefault = "qualified"> <!-- Anfang der Include-Datei. --> <xsd:group name = "Freigabedaten"> <xsd:annotation> <xsd:documentation>Beinhaltet zur Zeit nur die TAN</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element name = "TAN" type = "TypTAN"/> </xsd:sequence> </xsd:group> <xsd:group name = "Anmeldedaten"> <xsd:annotation> <xsd:documentation>Beinhaltet alle Daten, die bei jedem Request mitgegeben werden. Entweder Sitzungs-ID als Surrogat der Anmeldung oder die eigentlichen Anmeldedaten. Diese Struktur könnte später ggf. noch mehrere Alternativen bekommen!</xsd:documentation> </xsd:annotation> <xsd:choice> <xsd:element name = "Anmeldung" type = "TypAnmeldungsdaten"/> <xsd:element name = "Sitzungs-ID" type = "TypSitzung"/> </xsd:choice> </xsd:group> <xsd:group name = "Bezugskonto"> <xsd:annotation> <xsd:documentation>Dies ist das fachliche Konto, mit dem die Operation durchgeführt werden soll.</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element name = "Kontonummer" type = "TypKontonummer"/> <xsd:element name = "Bankleitzahl" type = "TypBankleitzahl" minOccurs = "0"/> </xsd:sequence> </xsd:group> <xsd:group name = "Auslandsempfaenger"> <xsd:sequence> <xsd:element name = "A-Empfaengername" type = "TypAuslandsadresszeile" maxOccurs = "2"/> <xsd:element name = "A-Empfaengerstrasse" type = "TypAuslandsadresszeile"/> <xsd:element name = "A-Empfaengerort" type = "TypAuslandsadresszeile"/> <xsd:element name = "A-Empfaengerlandeskennung" type = "TypLandeskennung"/> </xsd:sequence> </xsd:group> <xsd:group name = "Auslandsbankverbindung"> <xsd:sequence> <xsd:element name = "Bankkonto" type = "TypAuslandskontonummer"/> <xsd:element name = "Bankcode" type = "TypAuslandsbankleitzahl"/> <xsd:element name = "Bankname" type = "TypAuslandsadresszeile" maxOccurs = "2"/> <xsd:element name = "Bankstrasse" type = "TypAuslandsadresszeile"/> <xsd:element name = "Bankort" type = "TypAuslandsadresszeile"/> <xsd:element name = "Banklandeskennung" type = "TypLandeskennung" minOccurs = "0"/> </xsd:sequence> </xsd:group> <xsd:group name = "Auslandsanweisung"> <xsd:sequence> <xsd:element name = "Kostenart" type = "TypKostenart"/> <xsd:element name = "Betrag" type = "TypWaehrungsbetrag"/> <xsd:element name = "Zielwaehrung" type = "TypWaehrungskennzeichen"/> <xsd:element name = "Verwendungszweck" type = "TypAuslandsadresszeile" minOccurs = "0" maxOccurs = "4"/> <xsd:element name = "Termin" type = "TypDatum" minOccurs = "0"/> </xsd:sequence> </xsd:group> <xsd:group name = "Auslandsueberweisungsdaten"> <xsd:annotation> <xsd:documentation>Alle fachlichen Daten für eine Auslandsüberweisung</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:group ref = "Auslandsempfaenger"/> <xsd:group ref = "Auslandsbankverbindung"/> <xsd:group ref = "Auslandsanweisung"/> </xsd:sequence> </xsd:group> <xsd:group name = "Auslandsanweisungsdaten"> <xsd:annotation> <xsd:documentation>Alle fachlichen Daten für eine Auslandsanweisung</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:group ref = "Auslandsempfaenger"/> <xsd:group ref = "Auslandsanweisung"/> </xsd:sequence> </xsd:group> <xsd:complexType name = "TypAnmeldungsdaten"> <xsd:sequence> <xsd:element name = "Loginkonto" type = "TypKontonummer"/> <xsd:element name = "Bankleitzahl" type = "TypBankleitzahl" minOccurs = "0"/> <xsd:element name = "PIN" type = "TypPIN"/> </xsd:sequence> </xsd:complexType> <!-- Wiederverwendbare Gruppen von Elementen --> <xsd:simpleType name = "TypUserAgent"> <xsd:annotation> <xsd:documentation>Dieses Feld identifiziert die Client-Software (auch Version)</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "100"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypSitzung"> <xsd:annotation> <xsd:documentation>Dieses Feld wird ggf. bei der Anmeldung vom Host zum Client gereicht und muß genau dann bei jedem Request mitgegeben werden.</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "1000"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypErgebnis"> <xsd:restriction base = "xsd:string"> <xsd:enumeration value = "RC_OK"/> <xsd:enumeration value = "RC_SYSTEMFEHLER"/> <xsd:enumeration value = "RC_ANDERER_FEHLER"/> <xsd:enumeration value = "RC_GESPERRT"/> <xsd:enumeration value = "RC_PIN_FALSCH"/> <xsd:enumeration value = "RC_TAN_FALSCH"/> <xsd:enumeration value = "RC_LETZTE_TAN"/> <xsd:enumeration value = "RC_NICHT_ANWENDBAR"/> <xsd:enumeration value = "RC_LIMIT"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypMeldungstext"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "1000"/> <xsd:whiteSpace value = "preserve"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKontonummer"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "10"/> <xsd:minLength value = "1"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypBankleitzahl"> <xsd:restriction base = "xsd:string"> <xsd:length value = "8"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypPIN"> <xsd:restriction base = "xsd:string"> <xsd:length value = "5"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypTAN"> <xsd:restriction base = "xsd:string"> <xsd:length value = "6"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDTAString"> <xsd:annotation> <xsd:documentation>DTA-String mit beschränktem Zeichensatz.</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:pattern value = "[ÄÖÜäöüßA-Za-z0-9 \.,\-/\+\*$%&]*"/> <xsd:whiteSpace value = "preserve"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAuslandsadresszeile"> <xsd:restriction base = "TypDTAString"> <xsd:maxLength value = "35"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypEmpfaengername"> <xsd:restriction base = "TypDTAString"> <xsd:maxLength value = "27"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAuslandskontonummer"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "35"/> <xsd:minLength value = "1"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypBetrag"> <!-- <xsd:totalDigits value = "15"/> <xsd:fractionDigits value = "2"/> --> <xsd:list itemType = "xsd:decimal"/> </xsd:simpleType> <xsd:simpleType name = "TypWaehrungskennzeichen"> <xsd:annotation> <xsd:documentation>ISO Währungskennzeichen</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:length value = "3"/> <xsd:pattern value = "[A-Z]{3}"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDatum"> <xsd:annotation> <xsd:documentation>Datum</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:date"/> </xsd:simpleType> <xsd:simpleType name = "TypUmsatzzeile"> <xsd:annotation> <xsd:documentation>Umsatzzeile laut MT940, Feld :86: Hier keine Einschränkung des Zeichensatzes (also nicht TypDTAString), da diese Daten von anderen Banken kommen und damit etwaigen Einschränkungen nicht unterliegen.</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "27"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypZweckzeile"> <xsd:annotation> <xsd:documentation>Verwendungszweckzeile</xsd:documentation> </xsd:annotation> <xsd:restriction base = "TypDTAString"> <xsd:maxLength value = "27"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAuszugnummer"> <xsd:restriction base = "xsd:string"> <xsd:length value = "9"/> <xsd:pattern value = "[0-9]{5}/[0-9]{3}"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypZinssatz"> <xsd:annotation> <xsd:documentation>Ein Zinssatz, immer >= 0</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:decimal"> <xsd:minInclusive value = "0"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKontoinhaber"> <xsd:restriction base = "TypDTAString"> <xsd:maxLength value = "35"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKontobezeichnung"> <xsd:restriction base = "TypDTAString"> <xsd:maxLength value = "35"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypLandeskennung"> <xsd:restriction base = "xsd:string"> <xsd:length value = "2"/> <xsd:pattern value = "[A-Z]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAuslandsbankleitzahl"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "11"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKostenart"> <xsd:restriction base = "xsd:string"> <xsd:enumeration value = "OUR"/> <xsd:enumeration value = "BEN"/> <xsd:enumeration value = "SHARE"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAuftragsnummer"> <xsd:annotation> <xsd:documentation>ISN der Postbank</xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:length value = "8"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDauerauftragsID"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "100"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDatumUhrzeit"> <xsd:restriction base = "xsd:dateTime"/> </xsd:simpleType> <xsd:simpleType name = "TypVorgangsart"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "20"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypBearbeitungskennzeichen"> <xsd:restriction base = "xsd:string"> <xsd:enumeration value = "widerrufen"/> <xsd:enumeration value = "in Bearbeitung"/> <xsd:enumeration value = "liegt vor"/> <xsd:enumeration value = "unbekannt"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypWochentag"> <xsd:restriction base = "xsd:string"> <xsd:enumeration value = "Mo"/> <xsd:enumeration value = "Di"/> <xsd:enumeration value = "Mi"/> <xsd:enumeration value = "Do"/> <xsd:enumeration value = "Fr"/> <xsd:enumeration value = "Sa"/> <xsd:enumeration value = "So"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypMonatsRhythmusWert"> <xsd:restriction base = "xsd:integer"> <xsd:enumeration value = "1"/> <xsd:enumeration value = "2"/> <xsd:enumeration value = "3"/> <xsd:enumeration value = "4"/> <xsd:enumeration value = "6"/> <xsd:enumeration value = "12"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypWochenRhythmusWert"> <xsd:restriction base = "xsd:integer"> <xsd:maxInclusive value = "1"/> <xsd:minInclusive value = "1"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypTagesRhythmusWert"> <xsd:restriction base = "xsd:integer"> <xsd:maxInclusive value = "1"/> <xsd:minInclusive value = "1"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDauerauftragsnummer"> <xsd:annotation> <xsd:documentation>vierstellige Auftragsnummer 0000 = "Neu" </xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:length value = "4"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDauerauftragsart"> <xsd:annotation> <xsd:documentation>Dauerauftragsart, "13" kann nicht bearbeitet werden. </xsd:documentation> </xsd:annotation> <xsd:restriction base = "xsd:string"> <xsd:length value = "2"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKundennummer"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "10"/> <xsd:minLength value = "1"/> <xsd:pattern value = "[0-9]*"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypOBG"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "4"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypOrganschluessel"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "2"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypKurzname"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "24"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypGAB"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "4"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypBonitaet"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "47"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypChar"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "1"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypDatumString"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "10"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString2"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "2"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString3"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "3"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString4"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "4"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString5"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "5"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString9"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "9"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString10"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "10"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString15"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "15"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString20"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "20"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString27"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "27"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString54"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "54"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypString80"> <xsd:restriction base = "xsd:string"> <xsd:maxLength value = "80"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "TypAusfuehrungstag"> <xsd:restriction base = "xsd:integer"> <xsd:maxInclusive value = "99"/> <xsd:minInclusive value = "1"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name = "TypMeldung"> <xsd:simpleContent> <xsd:extension base = "TypMeldungstext"> <xsd:attribute name = "Nummer" use = "optional" type = "TypString10"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name = "TypWaehrungsbetrag"> <xsd:annotation> <xsd:documentation>Betrag inklusive Währungskennzeichen als Attribut</xsd:documentation> </xsd:annotation> <xsd:simpleContent> <xsd:extension base = "TypBetrag"> <xsd:attribute name = "Waehrung" use = "required" type = "TypWaehrungskennzeichen"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name = "TypUmsatztext"> <xsd:annotation> <xsd:documentation>Eigentlich sollte man die Textzeilen in einem umgebenden Element "Text" kapseln (<Text><Zeile></Zeile><Zeile></Zeile></Text>), aber MSXML 4 kann das nicht...</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element name = "Zeile" type = "TypUmsatzzeile" minOccurs = "0" maxOccurs = "14"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name = "TypZweck"> <xsd:annotation> <xsd:documentation>Verwendungszweck (eventuell nur zwei Zeilen???)</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element name = "Zeile" type = "TypZweckzeile" minOccurs = "0" maxOccurs = "4"/> </xsd:sequence> </xsd:complexType> <!-- AUSLANDSUEBERWEISUNG --> <xsd:complexType name = "TypAuslandsueberweisungsAnforderung"> <xsd:annotation> <xsd:documentation>Dieser Request macht eine Auslandsüberweisung</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:sequence minOccurs = "0"> <xsd:group ref = "Bezugskonto"/> </xsd:sequence> <xsd:group ref = "Auslandsueberweisungsdaten"/> </xsd:sequence> </xsd:complexType> <!-- AUSLANDSSCHECK --> <!-- AUSLANDSBARAUSZAHLUNG --> <xsd:complexType name = "TypAuslandsanweisungAnforderung"> <xsd:annotation> <xsd:documentation>Dieser Request macht einen Auslandsscheck bzw. eine Auslandsbarauszahlung</xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:sequence minOccurs = "0"> <xsd:group ref = "Bezugskonto"/> </xsd:sequence> <xsd:group ref = "Auslandsanweisungsdaten"/> </xsd:sequence> </xsd:complexType> <!-- Definition der Anforderung --> <xsd:element name = "ANFORDERUNG" type = "TypAnforderung"/> <xsd:complexType name = "TypAnforderung"> <!-- <xsd:element name = "AUSLANDSWAEHRUNGEN" type = "TypAuslandswaehrungAnforderung"/> --> <xsd:sequence> <xsd:choice> <xsd:element name = "AUSLANDSUEBERWEISUNG" type = "TypAuslandsueberweisungsAnforderung"/> <xsd:element name = "AUSLANDSSCHECK" type = "TypAuslandsanweisungAnforderung"/> <xsd:element name = "AUSLANDSBARAUSZAHLUNG" type = "TypAuslandsanweisungAnforderung"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema> Applied to the following XML instance: <ANFORDERUNG xmlns="http://www.congenio.de/schema/BankingRequest"> <AUSLANDSUEBERWEISUNG> <A-Empfaengername>Frank Hoefer</A-Empfaengername> <A-Empfaengername>& Soehne</A-Empfaengername> <A-Empfaengerstrasse>Dumpfbackengasse 13</A-Empfaengerstrasse> <A-Empfaengerort>Timbuktu</A-Empfaengerort> <A-Empfaengerlandeskennung>AT</A-Empfaengerlandeskennung> <Bankkonto>29857890357</Bankkonto> <Bankcode>01234567890</Bankcode> <Bankname>Le Banko</Bankname> <Bankname>est fait</Bankname> <Bankstrasse>Herzoginnenallee 17</Bankstrasse> <Bankort>Zuerich</Bankort> <Banklandeskennung>AT</Banklandeskennung> <Kostenart>SHARE</Kostenart> <Betrag Waehrung="USD">13.00</Betrag> <Zielwaehrung>USD</Zielwaehrung> <Verwendungszweck>1</Verwendungszweck> <Termin>2001-10-30</Termin> </AUSLANDSUEBERWEISUNG> </ANFORDERUNG> Xerces 1.4.3 and 1.4.4 throw an error: 'Error: cos-nonambig: (http://www.congenio.de/schema/BankingRequest,Verwendungszweck) and (http://www.congenio.de/schema/BankingRequest,Verwendungszweck) violate the "Unique Particle Attribution" rule.' This applies when the feature "http://apache.org/xml/features/validation/schema-full-checking" is true. Interestingly, the maxOccurs for the particle "Verwendungszweck" can be set to 1 and all is well. I doubt that the Unique Particle Attribution rule is broken by this. I see no neccessary lookahead or ambiguity involved with this example. Kind regards, Dr. Uwe Meyer-Gruhl