Announcement

Collapse
No announcement yet.

Referentielle Integrität für xs:list

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Referentielle Integrität für xs:list

    Hallo Forum,

    ich habe folgendes XML-Dokument
    Code:
    <Produkte>
      <Produkt nummer="1" name="Wurst">
        <ZusatzStoffListe>1 2</ZusatzStoffe>
      </Produkt>
      <Produkt nummer="2" name="Käse">
        <ZusatzStoffListe>1</ZusatzStoffListe>
      </Produkt>
      <ZustazStoff nummer="1" name="Farbstoff" />
      <ZusatzStoff nummer="2" name="Konservierungssoffe" />
    <Produkte>
    Das Schema habe ich soweit, dass alle Attributwerte auf die gültigen Werte eingeschränkt sind und auch required/optional. Auch die Key-Eigenschaften der Nummernattribute habe ich hinbekommen. Das ZusatzStoffListe-Element habe ich so definiert
    Code:
    <xs:element name="ZusatzStoffListe" minOccurs="0" maxOccurs="1">
      <xs:simpleType>
        <xs:list itemType="xs:nonNegativeInteger" />
      </xs:simpleType>
    </xs:element>
    Ich würde bei dieser Liste nun gerne die gültigen Werte auf die Nummern der existierenden ZusatzStoffe einschränken. Ich weiß aber nicht, wie das "keyref" aussehen muss. In den Beispielen, die ich mir angeschaut habe, steht das keyref immer direkt unter dem key. Es werden aber immer nur einzelne Attributwerte validiert und nicht der Inhalt einer Liste. Geht das überhaupt?

    Dank und Gruß ngomo
    Zuletzt editiert von ngomo; 21.07.2011, 22:24.
    http://www.winfonet.eu

  • #2
    Ich bin mir zwar nicht sicher, aber ich denke, mit Version 1.0 der Schemasprache und XPath 1.0 lässt sich das mit der referentiellen Integrität und xs: list nicht lösen, es gibt keine Möglichkeit, die einzelnen Werte in der List anzusprechen. Du müsstest statt xs: list besser Elemente verwenden, also
    Code:
    <Produkte>
      <Produkt nummer="1" name="Wurst">
        <ZusatzStoffListe>
          <Stoff>1</Stoff>
          <Stoff>2</Stoff>
        </ZusatzStoffListe>
      </Produkt>
      <Produkt nummer="2" name="Käse">
        <ZusatzStoffListe>
          <Stoff>1</Stoff>
         </ZusatzStoffListe>
      </Produkt>
      <ZusatzStoff nummer="1" name="Farbstoff" />
      <ZusatzStoff nummer="2" name="Konservierungssoffe" />
    <Produkte>

    Comment


    • #3
      Entweder oder

      Hallo Martin,

      danke für den Tipp. Ich habe mal weiter gegoogelt und außer unbeantworteten Fragen nichts gefunden. Es scheint also wirklich nicht zu gehen. D.h. entweder ich verzichte auf referentielle Integrität im Schema und habe dafür ein kompakteres Dokument oder ich nutze referentielle Integrität und habe dafür viele Kleinst-Elemente. Ich hab mich für das kompakte Dokument entschieden und prüfe die List-Items jetzt per Java-Code nach dem Parsen.

      Danke nochmal und ein schönes Wochenende,
      ngomo
      http://www.winfonet.eu

      Comment


      • #4
        Was möglich ist, ist die Verwendung von Attributen mit den Typen ID und IDREFS, also etwa
        Code:
        <Produkte>
          <Produkt nummer="1" name="Wurst">
            <ZusatzStoffListe stoffe="s1 s2"></ZusatzStoffListe>
          </Produkt>
          <ZustazStoff nummer="s1" name="Farbstoff" />
          <ZusatzStoff nummer="s2" name="Konservierungssoffe" />
        <Produkte>
        wobei dann halt nummer vom Typ ID ist und stoffe vom Typ IDREFS

        Comment


        • #5
          Super Idee

          Hallo Martin,
          die Idee ist echt gut. Wundert mich, dass davon in Tutorials (z.B. http://www.w3schools.com/) praktisch nichts auftaucht. Wenn mann nicht gezielt nach "xs:ID", "xs:IDREF" sucht, kann man dieses Feature sehr leicht übersehen.

          Ich habe Deine Anregung aufgenommen und etwas modifiziert. Im Element ZusatzStoff ist die id so definiert:
          Code:
          <xs:attribute name="id" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:ID">
                <xs:pattern value="s\d+" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          Das Pattern benutze ich nur für die Ids von ZusatzStoffen. Wenn also eine id aus "s" gefolgt von mindestens einer Ziffer besteht, habe ich eine ZusatzStoff-Id.

          Das Element ZusatzStoffListe hab ich ganz entfernt und in ein Attribut "zusatzStoffe" des Produkt-Elements umgewandelt. Dies ist wie folgt definiert.
          Code:
          <xs:attribute name="zusatzStoffe" use="optional">
            <!-- Ein einfaches type="xs:IDREFS" reicht nicht, weil dann jeder Wert vom
              Typ ID gültig wäre. Ich will aber nur Zusatz-Stoff-Ids, also etwas mehr
              einschränken.
             -->
            <xs:simpleType>
              <xs:restriction base="xs:IDREFS">
                <xs:pattern value="s\d+(\ss\d+)*" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          Mit dem Konstrukt stelle ich sicher, dass nur Werte vom Typ ID erlaubt sind ("IDREFS"). Mit dem Pattern schränke ich den Wertebereich so ein, dass nur ZusatzStoff-IDs möglich sind. So hab ich meine referentielle Integrität.

          Dank und Gruß ngomo
          http://www.winfonet.eu

          Comment

          Working...
          X