2009-03-27 7 views
2

Ich habe eine Attributgruppe in meinem XSD-Schema definiert. Von dem, was ich gelesen habe und ausprobiert, es keine Möglichkeit gibt, konnte ich die Optionalität der Nutzung der gesamten Gruppe angeben (so, dass entweder alle Attribute angegeben werden, oder keine), so etwas wie:XSD attributGroup optional?

<xs:attributeGroup name="NameDesc"> 
    <xs:attribute name="n" type="xs:string" use="required"/> 
    <xs:attribute name="d" type="xs:string" use="required"/> 
    <xs:attribute name="uinf" type="xs:string" use="required"/> 
    </xs:attributeGroup> 

    <xs:complexType name="g"> 
    <xs:attributeGroup ref="tns:NameDesc" use="optional" /> 
    </xs:complexType> 

(Beachten Sie die use = "erforderlich" Ich habe in der attributeGroup-Referenz hinzugefügt, die nicht zulässig ist). Habe ich recht oder gibt es einen Weg dies zu erreichen?

Ich habe gelesen How to make "use" attribute (required/optional) depend on another value?, aber ich bin mir nicht sicher, dass dies für meinen Fall gilt.

Antwort

4

Soweit ich weiß (jemand korrigiert mich bitte, wenn ich falsch liege), ist es unmöglich Attribute so abhängig zu machen.

Könnten Sie die attributeGroup zu einem tatsächlichen Element machen? Auf diese Weise könnte das gesamte Element als Kindelement vorhanden sein oder nicht.

Dies wäre auch ein besseres Design, wenn Sie Ihr Schema auf Objekte zuordnen würden.

+0

Ja, das wäre wahrscheinlich eine bessere Option sein. Danke, das habe ich nicht getan. –

+1

Können Sie es simulieren, indem Sie verschiedene Typen auf gleichnamige Elemente anwenden, und nur einer der Typen die Attributgruppe hat? d. h. XML-Polymorphismus, wie . Ich sage nicht, dass es praktisch wäre :-) – 13ren

-1

Es gibt eine andere Möglichkeit, dies ohne die Verwendung von attributeGroup zu tun.

<xs:complexType name="g"> 
<xs:sequence> 
    <xs:attribute name="type"/> 
    <xs:sequence minOccurs="0" maxOccurs="1"> 
    <xs:attribute name="n" type="xs:string" use="required"/> 
    <xs:attribute name="d" type="xs:string" use="required"/> 
    <xs:attribute name="uinf" type="xs:string" use="required"/> 
    </xs:sequence> 
</xs:sequence> 
</xs:complexType> 

Wo minOccurs = "0" maxOccurs = "1" macht das Attribut Gruppe 3 Elemente optional, und alle erforderlich, wenn eine solche verwendet wird: Sie können so etwas wie verwenden.

Referenz: W3 Wiki

+3

Die Seite, die Sie anführen, ist effektiv eine Wunschliste für die Lösung dieses Problems. Es verwendet keine gültige XSD-Grammatik. "Auf einigen Seiten für Co-constraint Use Cases wurden Beispiellösungen in diesem Stil bereitgestellt, die die XSD-Standardnotation verwenden, mit der Ausnahme, dass 'xsd: attribut' sowohl im Inhaltsmodell als auch danach angezeigt wird (in diesem Fall die Erklärungen sind unbedingt). " - [W3 Wiki] (http://www.w3.org/wiki/Grammatikalisierung) – dcsohl