Tim: Xsd - Attributwert abfragen

Hallo Leute,

Ich versuche gerade ein XML Schema zu schreiben und habe ein Problem. Leider hab ich bisher noch nichts dazu im Forum gefunden.

Ich möchte gerne einen Attributwert der gesetzt wurde abfragen.
Mal ein Versuch der Erklärung (bin nich so gut im erklären), ich habe z.B. folgendes Dokument:

...
<person art="student">
  <name>Blablub</name>
  <matnr>1234</matnr>
</person>

<person art="mitarbeiter">
  <name>lala</name>
  <personummer>5678</personummer>
</person>
...

nun möchte in dem Schema festlegen, wenn unter art "student" angegeben ist dann müssen die Tags <name> und <matnr> angegeben werden und wenn unter art "mitarbeiter" angegeben ist müssen die Tags <name> und <peronummer> angegeben werden.
Leider weiß ich nicht wie das geht, vielleicht kann mir einer von euch weiter helfen, das wäre wirklich toll.

LG
Tim

  1. Hallo,

    nun möchte in dem Schema festlegen, wenn unter art "student" angegeben ist dann müssen die Tags <name> und <matnr> angegeben werden und wenn unter art "mitarbeiter" angegeben ist müssen die Tags <name> und <peronummer> angegeben werden.
    Leider weiß ich nicht wie das geht,

    Das geht gar nicht.
    Auch in XML-Schema ist es nicht möglich auf Grund von Attributwerten solche Unterscheidungen zu definieren.

    Grüße
    Thomas

    1. Achso, schade :( . Aber trotzdem danke für die Antwort :)

    2. Hallo Thomas,

      Auch in XML-Schema ist es nicht möglich auf Grund von Attributwerten solche Unterscheidungen zu definieren.

      Wenn ich mich nicht vertue, aber in RELAX NG, hier mal in kompakter Syntax, ungetestet:

      ~~~relaxng Person = element person { Student | Mitarbeiter }

      Student = (   attribute art { "student" }
                    & element matnr { xsd:int }
                    & Name )

      Mitarbeiter = (   attribute art { "mitarbeiter" }
                        & element matnr { xsd:int }
                        & Name )

      Name = element name { text }

        
        
      Wäre in XML Schema mittels xs:choice nicht ein gleiches möglich? Oder kann letzteres nur zwischen Elementen als Inhalt unterscheiden?  
        
        
      Tim
      
      1. Hallo Thomas,

        Auch in XML-Schema ist es nicht möglich auf Grund von Attributwerten solche Unterscheidungen zu definieren.

        Wenn ich mich nicht vertue, aber in RELAX NG, hier mal in kompakter Syntax, ungetestet:

        Wäre in XML Schema mittels xs:choice nicht ein gleiches möglich?

        Nein.
        Die in Frage kommende Lösung wäre das sgnt. "co-occurence constraints" mit key*, aber es sind in den im XML-Schema verwendbaren XPath-Ausdrücken keine Test wie "@attr = 'foo'" erlaubt.

        *) gemeint ist z.B. "wenn Attribut a vorhanden, muss element b fehlen" etc.
        Mit solche Lösungen kann man teilwese die UPA-Regel umgehen (diese Regel gibts im RELAX (NG) oder im TREX eben nicht).

        Grüße
        Thomas