berlinsurfer: XML Validierung

Hallo,
mal wieder das leidige Thema XML-Validierung:
ich bekomme ein Schema gelifert, in dem steht:

  <xs:simpleType name="typ-Anschrift">  
    <xs:restriction base="xs:string">  
      <xs:maxLength value="100"/>  
      <xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>  
    </xs:restriction>  
  </xs:simpleType>  

Das liest sich für mich wie das das erste Zeichen aus Basic-Latin oder Latin-1-Supplement sein darf, jedoch kein Leerzeichen, Tab, Carriage Return oder Newline.
Für das zweite und jedes folgende gilt das Gleiche, nur sind hier Leerzeichen wieder erlaubt.
Nun versuche ich in php mittels $dom->schemaValidate() die xml-Datei zu validieren, schaffe es jedoch nur, wenn der zu matchende String keine ts,rs oder ns enthält. Es werden nicht die Sonderzeichen, sondern die Buchstaben erkannt. Wo ist da der Fehler ? Ist obiger Ausdruck nicht gleichbedeutend mit (indem die zweite Klasse auseinandergepflückt wurde; dieser funktioniert):

  <xs:simpleType name="typ-Anschrift">  
    <xs:restriction base="xs:string">  
      <xs:maxLength value="100"/>  
      <xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-\t-\r-\n]*"/>  
    </xs:restriction>  
  </xs:simpleType>  

Siehe auch:
https://forum.selfhtml.org/?t=202319&m=1366332

Danke & Gruß,
berlinsurfer

--
Science flies you to the moon.
Religion flies you into buildings.
selfcode: ie:{ fl:| br:^ va:? ls:< fo:{ rl:( n4:{ ss:} de:[ js:} ch:{ sh:) mo:? zu:)
  1. Hi,

    <xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>

    http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#charcter-classes
    Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Danke, ChrisB,
      warum funktioniert es denn aber korrekt im RegEx Buddy ?
      Liegt PHP eine andere Engine zugrunde ?

      Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.

      MfG ChrisB

      --
      Science flies you to the moon.
      Religion flies you into buildings.
      selfcode: ie:{ fl:| br:^ va:? ls:< fo:{ rl:( n4:{ ss:} de:[ js:} ch:{ sh:) mo:? zu:)
      1. Hi,

        warum funktioniert es denn aber korrekt im RegEx Buddy ?

        Nur weil ChrisB das nicht erkennen kann, muß es ja nicht so sein, siehe mein Posting von 17:57

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    2. Hi,

      <xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>

      http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#charcter-classes
      Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.

      Nächstes Mal genauer hinschauen ;-)

      11 charClass    ::=    charClassEsc | charClassExpr | WildcardEsc

      Da nehmen wir die charClassExpr

      12 charClassExpr    ::=    '[' charGroup ']'

      weiter mit der charGroup

      13 charGroup    ::=    posCharGroup | negCharGroup | charClassSub

      da nehmen wir die charClassSub

      16 charClassSub    ::=    ( posCharGroup | negCharGroup ) '-' charClassExpr

      hier nehmen wir posCharGroup - charClassExpr

      Für posCharGroup
      14 posCharGroup    ::=    ( charRange | charClassEsc )+
      diesen Teil könnte man jetzt Regel für Regel weiter zerlegen (über charClassEsc -> catEsc ...), aber kurz gesagt deckt der das
      \p{IsBasicLatin}\p{IsLatin-1Supplement}
      ab.

      bleibt also noch das - und charClassExpr. - als Literal braucht nicht weiter aufgelöst zu werden. Bleibt charClassExpr.

      12 charClassExpr    ::=    '[' charGroup ']'

      charGroup könnte ich wieder nach den Regeln weiter zerlegen (charRange -> XmlCharIncDash ..., charClassEsc->SingleCharEsc ...), aber kurz gesagt deckt das die 4 Whitespace-Zeichen ab.
      Diese charClassExpr deckt also [ \t\r\n] ab.
      Gehen wir wieder zurück: davor war das literale -, also -[ \t\r\n]
      Weiter zurück: posCharGroup-[ \t\r\n]
      Noch weiter: [posCharGroup-[ \t\r\n]]
      Und posCharGroup war ja das \p{IsBasicLatin}\p{IsLatin-1Supplement}, womit die erste [] aus dem Originalausdruck komplett abgedeckt ist.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Hallo, Andreas,
        vielen Dank für die ausführliche Beschreibung & Erklärung, sie war sehr hilfreich. Die betreffenden XSD-Dateien stammen vom Kratffahrtbundesamt, wahrscheinlich wissen die, was sie tun (hoffentlich...)
        Zu meiner Ursprungsfrage: warum funktioniert die Validierung in PHP nicht, wenn ich -\t-\n-\r schreibe, aber schon ? Benutzt PHP eine andere RegEx-Engine ? Hat es überhaupt was damit zu tun ?
        Vielen Dank schon mal & Gruß aus dem verschneiten Berlin

        --
        Science flies you to the moon.
        Religion flies you into buildings.
        selfcode: ie:{ fl:| br:^ va:? ls:< fo:{ rl:( n4:{ ss:} de:[ js:} ch:{ sh:) mo:? zu:)
        1. Hi,

          vielen Dank für die ausführliche Beschreibung & Erklärung, sie war sehr hilfreich.

          He, die war aber für Chris, nicht für Dich! ;-)

          Die betreffenden XSD-Dateien stammen vom Kratffahrtbundesamt, wahrscheinlich wissen die, was sie tun (hoffentlich...)

          Optimist ;-)

          Zu meiner Ursprungsfrage: warum funktioniert die Validierung in PHP nicht,

          Weil das Subtrahieren m.W. von den PCRE nicht unterstützt wird. Soweit ich weiß, kennt nur Java etwas ähnliches ([[a-z]&&[^aeiou]] für alle Konsonanten), aber mit deutlich anderer Syntax.

          wenn ich -\t-\n-\r schreibe, aber schon ?

          Wie sieht der Ausdruck genau aus?
          Ich vermute aber, daß das "Funktionieren" Dir nur so vorkommt, und daß die Menge Deiner Teststrings die Fehler nicht aufzeigt.

          Benutzt PHP eine andere RegEx-Engine ? Hat es überhaupt was damit zu tun ?

          Ja. Meist PCRE oder veraltet ereg. Das erkennst Du am ersten Teil (ereg_ oder pcre_) der von Dir benutzten Funktion.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.