Announcement

Collapse
No announcement yet.

Entscheidung ob Attribut required ist

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

  • Entscheidung ob Attribut required ist

    hallo zusammen,

    ist es möglich in xsd etwas zu formulieren, das bei einem Wert eines Attributs weitere Attribute voraussetzt?

    Besp:
    HTML Code:
    <static type="a" second="true" minute="false" />			
    wenn aber type="b" ist, sollen andere Attribute verlangt sein:
    HTML Code:
    <static type="b" hour="true" day="false" />			

  • #2
    Assertions in XML Schema 1.1 ermöglichen das. Alternativ mal mit Schematron beschäftigen.

    BTW: Falscher Forumbereich!

    Comment


    • #3
      ich habe das jetzt mal ausprobiert.

      allerdings funktioniert das so nicht. Ich habe mal versucht auf einen bestimtmen Eintrag im Attribut zu vergleichen und dazu dann die Attribute eines Typs zu laden.

      HTML Code:
      <xsd:complexType name="static-type">
        <xsd:attribute name="type" type="mytype" use="required" /> 
        <xsd:assert test="@type eq 'a'" type="mytype-a" />
        <xsd:assert test="@type eq 'b'" type="mytype-b" />  
       </xsd:complexType>
       
       <xsd:simpleType name="mytype">
        <xsd:restriction base="xsd:string">
         <xsd:enumeration value="a" />
         <xsd:enumeration value="b" />   
        </xsd:restriction>
       </xsd:simpleType> 
       
       <xsd:complexType name="mytype-a">
        <xsd:attribute name="b" type="xsd:boolean" use="required" />
        <xsd:attribute name="c" type="xsd:boolean" use="required" />
        <xsd:attribute name="d" type="xsd:boolean" use="required" />
        <xsd:attribute name="e" type="xsd:boolean" use="required" />
       </xsd:complexType>
       
       <xsd:complexType name="mytype-b">
        <xsd:attribute name="f" type="xsd:boolean" use="required" /> 
        <xsd:attribute name="g" type="xsd:boolean" use="required" /> 
        <xsd:attribute name="g" type="xsd:boolean" use="required" /> 
        <xsd:attribute name="i" type="xsd:boolean" use="required" /> 
        <xsd:attribute name="j" type="xsd:boolean" use="required" /> 
        <xsd:attribute name="k" type="xsd:boolean" use="required" /> 
       </xsd:complexType>

      Comment


      • #4
        Ich habe mal ein anderes Beispiel ausprobiert, was eigentlich funktionieren sollte, bekomme aber immer folgende Meldung:

        Error XPST0003 at line 1, column 5: A construct was encountered which is disallowed in the current language(XPath 2.0).
        Error XSDError in Unknown location, at line 9, column 81: test attribute of assertion element contains invalid content: {if (@classification eq 'secret') then ... else ... true()}.
        Error XSDError in test.xml, at line 1, column 34: No definition for element Document available.

        HTML Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
         <xs:element name="Document">
          <xs:complexType>
           <xs:sequence>
            <xs:element name="Para" type="ParaType" maxOccurs="unbounded" />
           </xs:sequence>
           <xs:attribute name="classification" type="classificationLevels" use="required"/>
           <xs:assert test="if (@classification eq 'secret') then ... else ... true()" />
          </xs:complexType>
         </xs:element>
        </xs:schema>
        HTML Code:
        <Document classification="secret">
         <Para classification="unclassified">...</Para>
         <Para classification="secret">...</Para>
         <Para classification="unclassified">...</Para>
         <Para classification="secret">...</Para>
        </Document>

        Comment


        • #5
          Die Fehler liegen offensichtlich dort wo die Punkte stehen, also offenbar ein fehlerhafter XPath-Ausdruck.

          Comment


          • #6
            Das Problem ist jetzt, wenn ich nun folgenden XPATH Eintrag benutzt bekomme ich die selbe Meldung:

            Code:
            if (@classification eq 'secret') then not(Para/@classification = 'top-secret')
            else if (@classification eq 'confidential')
            then not(Para/@classification = 'top-secret')
            and not(Para/@classification = 'secret')
            else if (@classification eq 'unclassified')
            then not(Para/@classification = 'top-secret')
            and not(Para/@classification = 'secret')
            and not(Para/@classification = 'confidential')
            else true()
            Aber wo kann denn da der Fehler liegen?

            Comment


            • #7
              In welchem Tool tritt das Problem auf? Meine sind noch gar nicht 1.1-fähig, da XSD 1.1 ist noch keine finale Empfehlung hat.

              Comment

              Working...
              X