hh: XSD Validierung

Hänge etwas bei meinem xsd schema

Problem ergibt sich aus:
<root>
<Anzug teil="hosen">
<Jeans>Text zu den Jeanshosen</Jeans>
<Stoff>Text zu den Stoffhosen</Stoff>
<Lack>Text zu Lack</Lack>
</Anzug>
<Anzug teil="schuhe">
<Leder>Text zu Lederschuhen</Leder>
<Plastik>Text zu Plastikschuhen</Plastik>
</Anzug>

<sns:schuhe AnzugRef="Leder">werte</sns:schuhe>
<sns:schuhe AnzugRef="Plastik">werteXY</sns:schuhe>
<!-- diese Zeile ist ungültig -->
<sns:schuhe AnzugRef="Lack">Wert</sns:schuhe>

</root>

wie muss ich das Attribute AnzugRef in meinem xsd schema definieren, damit mir die Validierung einen Fehler für die Zeile <sns:schuhe AnzugRef="Lack">Wert</sns:schuhe> ausgibt, da es das Unterelemet Lack nicht gibt für <Anzug teil="schuhe"/>? Der andere namespace dürfte kein Problem sein und kann aus der problematik ausgeblendet werden. Ich könnte auch das XML umschreiben etwa so (wäre wohl sinnvoller eventuell), das Problem bleibt das Gleiche:

<root>
<Anzug teil="hosen">
<Eigenschaft name="Jeans">Text zu den Jeanshosen</Eigenschaft>
<Eigenschaft name="Stoff">Text zu den Stoffhosen</Eigenschaft>
<Eigenschaft name="Lack">Text zu Lack</Eigenschaft>
</Anzug>
<Anzug teil="schuhe">
<Eigenschaft name="Leder">Text zu Lederschuhen</Eigenschaft>
<Eigenschaft name="Plastik">Text zu Plastikschuhen</Eigenschaft>
</Anzug>

<sns:schuhe AnzugRef="Leder">werte</sns:schuhe>
<sns:schuhe AnzugRef="Plastik">werteXY</sns:schuhe>
<!-- diese Zeile ist ungültig -->
<sns:schuhe AnzugRef="Lack">Wert</sns:schuhe>

</root>

Wäre sehr dankbar für einen Lösungsvorschlag

Gruß,

Holger

  1. Hallo,

    wie muss ich das Attribute AnzugRef in meinem xsd schema definieren, damit mir die Validierung einen Fehler für die Zeile <sns:schuhe AnzugRef="Lack">Wert</sns:schuhe> ausgibt,

    ???

    Kannst du bitte deine Frage nochmal formulieren?

    Grüße
    Thomas

    1. Hallo Thomas,

      Kannst du bitte deine Frage nochmal formulieren?

      Kann ich gerne, nur weiss ich nicht, ob ich sie diesmal besser stellen kann ;-)

      Also ich habe ein xsd schema. In dieses schema möchte ich nun die möglichen Werte für das Attribute AnzugRef festlegen. In dem von mir angegebenen beispiel sollte die validierung einen fehler ausweisen damit ich überprüfen kann, ob das schema richtig aufgebaut ist. Das attribute AnzugRef darf nicht den wert "Lack" enthalten, sondern für sns:schuhe lediglich "Plastik" oder "Leder"

      <!-- diese Zeile ist ungültig -->
      <sns:schuhe AnzugRef="Lack">Wert</sns:schuhe>

      Ich will also lediglich die Werte für AnzugRef festlegen.

      Viele Grüße,

      Holger

      1. Hi,

        Ich will also lediglich die Werte für AnzugRef festlegen.

        wie ist denn das Attribut im Moment definiert, als String? Wenn ja, dann nutze statt des Strings eine Restriction+Enumeration und geb da die erlaubten Werte an.

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        1. Hi,

          die erlaubten Werte sollen ja nicht fix im schema sein, sondern diese sollen sich aus der xml quelle ergeben. ähnlich wie idref, wo ja auch nachgeschaut wird, ob ein wert besteht

          <Anzug teil="hosen">
          <Eigenschaft name="Jeans">Text zu den Jeanshosen</Eigenschaft>
          <Eigenschaft name="Stoff">Text zu den Stoffhosen</Eigenschaft>
          <Eigenschaft name="Lack">Text zu Lack</Eigenschaft>
          </Anzug>
          <Anzug teil="schuhe">
          <Eigenschaft name="Leder">Text zu Lederschuhen</Eigenschaft>
          <Eigenschaft name="Plastik">Text zu Plastikschuhen</Eigenschaft>
          </Anzug>

          Aus der XML Quelle sollte das schema lesen, dass für sns:schuhe nur Leder oder Plastik zulässig ist, für sns:hosen Jeans, Stoff und Lack als Wert für AnzugRef zulässig ist. Weiss nicht, ob ich da etwas zuviel verlange von xsd. aber sollte doch möglich sein.

          1. Hallo,

            die erlaubten Werte sollen ja nicht fix im schema sein, sondern diese sollen sich aus der xml quelle ergeben. ähnlich wie idref, wo ja auch nachgeschaut wird, ob ein wert besteht

            <Anzug teil="hosen">
            <Eigenschaft name="Jeans">Text zu den Jeanshosen</Eigenschaft>
            <Eigenschaft name="Stoff">Text zu den Stoffhosen</Eigenschaft>
            <Eigenschaft name="Lack">Text zu Lack</Eigenschaft>
            </Anzug>
            <Anzug teil="schuhe">
            <Eigenschaft name="Leder">Text zu Lederschuhen</Eigenschaft>
            <Eigenschaft name="Plastik">Text zu Plastikschuhen</Eigenschaft>
            </Anzug>

            Aus der XML Quelle sollte das schema lesen, dass für sns:schuhe nur Leder oder Plastik zulässig ist, für sns:hosen Jeans, Stoff und Lack als Wert für AnzugRef zulässig ist. Weiss nicht, ob ich da etwas zuviel verlange von xsd. aber sollte doch möglich sein.

            Das ist richtig schön kompliziert. (Wobei ich leise anmerke, dass dies m.M.n. auf konzeptionelle Fehler im XML-Desing beruht.)
            Das Problem was du hast ist, dass du in Abhängigkeit von Attributwerten andere Attributwerte in Abhängigkeit stellen willst.
            Abhängigkeiten von Attributwerten kannst du mit xsd:key und/oder xsd:unique schaffen, schau dir mal http://forum.de.selfhtml.org/archiv/2006/2/t124134/#m799816 ff. an (und auch dir dort verlinkten Beispiele).
            So ad hoc kann ich auch nicht sagen, ob das was du möchtest wirklich in Schema ausgedrückt werden kann.

            Grüße
            Thomas

            1. Hallo Thomas,

              ja, mir schwebte auch schon eine Lösung über keyref vor (das sollte grundsätzlich auch gehen für eine generelle Wertgültigkeit über alle möglichen Attributwerte), nur mit dem "zirkelproblem" hängt es halt, dass für eine Element nur ganz bestimmte Werte zulässig sind. Ich studiere mal weiter ob ich etwas brauchbares zusammenbekomme - unique könnte da wohl ein Punkt sein, über den ich einsteigen könnte. Danke dir schon mal.

            2. Hallo Thomas,

              also die letzten Tage waren sehr ernüchternd, ich habe keine Möglichkeit gefunden, "dynamische" zulässige Attributewerte zu definieren. Da du aber auch leise angedeutet hast, dass man vielleicht das xml Design ändern könnte mal meine Frage in diese Richtung.

              Ich habe ein XML Report (alles abstrakt, da sonst sehr umfangreich):

              rootns:root
              .
              .
              <sns:jacke AnzugRef="Leder">werte</sns:schuhe>
              <sns:jacke AnzugRef="Stoff">werte</sns:schuhe>
              <sns:jacke AnzugRef="Lack">werte</sns:schuhe>
              <sns:hosen AnzugRef="Leder">werte</sns:schuhe>
              <sns:schuhe AnzugRef="Leder">werte</sns:schuhe>
              <sns:schuhe AnzugRef="Plastik">werteXY</sns:schuhe>
              <!-- diese Zeile ist ungültig -->
              <sns:schuhe AnzugRef="Lack">Wert</sns:schuhe
              .
              .
              </rootns:root>

              nun ein xsd file zur validierung

              <element id="sns_shuhe" name="schuhe" type="rootns:stringItemType" .. ../>
              <element id="sns_hosen" name="schuhe" type="rootns:stringItemType" .. ../>
              <element id="sns_jacke" name="schuhe" type="rootns:stringItemType" .. ../>

              <complexType name="stringItemType" final="extension">
              <simpleContent>
              <extension base="string">
              <attrbuteGroup ref="rootns:notnumericItemAttrs"/>
              </extension>
              </simpleContent>
              </complexType>

              <attributeGroup name="notnumericItemAttrs">
              <attributeGroup ref="rootns:allItemAttrs>
              <attribute name="AnzugRef">
              <simpleType>
              <restriction base="string">
              <enumeration value="Leder"/>
              </restriction>
              </simpleType>
              </attribute>
              </attributeGroup>

              so und nun das folgende Problem, AnzugRef hat immer als Ausgangswert "Leder" und ist der einzig zulässige Wert. Jetzt möchte ich aber noch spezielle "erweiterungen" definieren, dass für das Element "schuhe" das Attribute "AnzugRef" zusätzlich den Wert Plastik annehmen darf, gleichzeitig dürfen alle anderen Elemente auch den Wert Plastik enthalten. Ich muesste also eine Art Erweiterung einbringen als zulässige Werte für "AnzugRef". Gleichzeitig soll es aber zudem ein weitere Bedingung geben, die für bestimmte Elemente aber den Bereich möglicher Werte einschränkt. Also etwa für "schuhe" dann doch nur "Leder" und "Plastik"

              bezogen auf obiges Beispiel also muesste ich zwei sachen unterbringen,

              1. eine Erweierung, dass AnzugRef zusätzlich die Werte Stoff, Lack, Plastik enthalten kann
              2. Einschränkung für bestimmte Elemente z.B. schuhe für AnzugRef nur zulässig Leder und Plastik

              Diese 2 Bedingungen wollte ich gleich in das xml File schreiben, so dass "dynamisch" das Schema abhängig von den Vorgaben validiert. Habe aber keinen Weg gefunden. Nun denke ich daran, die Vorgaben in ein extra File zu schreiben, da ich das Grundschema nicht anfassen möchte, da es ziemlich viele Elemente gibt und die Einschränkung für bestimmte Elemente übersichtlich sind. Wie könnte man also eine grundsätzliche Erweiterung für AnzugRef über alle Elemente einbinben und gleichzeitig für wenige Elemtente diese vorgenommene Erweiterung einschränken. Klingt etwas komplex und das Beispiel ist vielleicht auch nicht anschaulich, aber generell dürfte es sich doch hierbei um ein nicht gar zu exotisches Problem handeln - Erweiterung der zulässigen Werte plus Einschränkung der Erweiertung auf bestimmte Werte für bestimmte Elemente.

              Gruß,

              Holger