2010-01-15 4 views
5

Ist es möglich, in XSD das folgende Szenario zu definieren:XML-Schema - Kindelemente abhängig von Existenz von optionalen Attribut

  1. Geordnetes Element hat ein Attribut, dass

    optional.

  2. Wenn das Attribut Wenn die

    attribute is present, there can be 
    
    zero or more child elements. 
    

Beispiel nicht

present in XML, at least one child 

element must exists. 
  • ist:

    VALID

    <parent externel-source="some_name" /> 
    
    
    
    <parent externel-source="some_name"> 
    
        <child>some value</child> 
    
    </parent> 
    
    
    
    <parent> 
    
        <child> some value</child> 
    
    </parent> 
    

    UNGÜLTIG

    <parent /> 
    
  • Antwort

    -1

    Nein ich denke nicht.

    +0

    Antworten dieser Art sind für mich nicht zufriedenstellend. Was ist der Grund für deine Aussage? –

    +2

    XML-Schematypen sind Ihren OO-Programmiertypen sehr ähnlich. Sie können einen komplexen Typ erstellen, und Sie können die Reihenfolge der Elementtypen von Elementen und Attributen und die Einschränkungen, welche Arten von Werten zugewiesen werden können, einschränken. Das ist alles, was xsd für Sie tun kann. Was Sie wollen, ist eine Einschränkung, die mehr als ein Element/Attribut umfasst, was mit xsd einfach nicht möglich ist. Sie müssen Ihren eigenen Code schreiben, um dies zu bestätigen. – affan

    +0

    Ich denke auch, dass es nicht möglich ist, und dieses Sprichwort ist eine ziemlich gute Antwort (wenn es richtig ist) :-) –

    3

    Nein. Der Grund ist: In Ihrem Fall versuchen Sie, das Vorhandensein eines Elements/Tags abhängig vom Wert eines anderen Tags/Attributs zu validieren. (XSD ist im Grunde eine Deklaration), die mehrere erfordert Deklaration eines gleichen Elements ..
    Mehrere Deklaration eines gleichen Elements nicht in XSD erlaubt ist .. :-(
    Schauen Sie sich die similar problem (click here) von einem Stackoverflow geschrieben Mitglied

    0

    Leider diese Nachricht wieder zu beleben, aber ich dachte, Ich könnte etwas über das "Warum" der Dinge hinzufügen. W3C XML Schema erfordert, dass alle seine Sequenzen vollständig deterministisch sind. Aus Gründen der Performance/Einfachheit ist es nicht darauf ausgelegt, nach vorne zu schauen oder zurückzuschauen, es funktioniert nur auf dem aktuellen Element. Ich glaube auch, dass dies von SGML übernommen wird.

    Was Sie tun möchten, erfordert eine solche Funktionalität. Vielleicht möchten Sie sich Schematron ansehen; Es unterstützt, was Sie wollen.

    0

    Ja, auf jeden Fall können Sie, mit xsi: type (was ist wahrscheinlich nicht das, was Sie wollen!). ZB mit dem xsd unten;

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xs:element name="data"> 
        <xs:complexType> 
         <xs:choice> 
          <xs:element ref="elemParent" minOccurs="1" maxOccurs="unbounded"/> 
         </xs:choice> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="elemParent" type="ctBase"></xs:element> 
    <xs:complexType name="ctNoAttChildReq"> 
        <xs:complexContent> 
         <xs:extension base="ctBase"> 
          <xs:sequence> 
           <xs:element name="elemKid" type="xs:string"></xs:element> 
           <xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element> 
          </xs:sequence>    
         </xs:extension> 
        </xs:complexContent>  
    </xs:complexType> 
    <xs:complexType name="ctAttNoChild"> 
        <xs:complexContent> 
         <xs:extension base="ctBase"> 
          <xs:attribute name="attReq" use="required"/> 
         </xs:extension> 
        </xs:complexContent>   
    </xs:complexType>  
    <xs:complexType name="ctBase" abstract="true"> 
        <xs:sequence/> 
    </xs:complexType>  
    

    Sie eine Instanz erhalten, die entweder ein Attribut oder ein oder mehrere Kinder hat, aber Sie haben xsi haben: Typ in der Instanz, die kein Show-Stopper sind oder nicht.

    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd"> 
    <elemParent attReq="Yo!" xsi:type="ctAttNoChild"/> 
    <elemParent xsi:type="ctNoAttChildReq"> 
        <elemKid>Adam</elemKid> 
    </elemParent> 
    <elemParent xsi:type="ctNoAttChildReq"> 
        <elemKid>Eve</elemKid> 
        <elemKidAdditional>Sid</elemKidAdditional> 
    </elemParent> 
    

    Verwandte Themen