2010-12-01 7 views
6

Ich habe diese XML-Datei:xsd: einzigartig mit optionalen Attributen

<objects> 
    <object name="ID1" /> 
    <object name="ID2" /> 
    <object name="ID2" color="green" /> 
    <object name="ID3" color="green" /> 
<objects> 

Ich mag würde dies gegen eine XSD validieren, so dass die Kombination zwischen name und color einzigartig ist in dem Dokument.

Das Problem ist, dass, wenn ich benutze:

<xs:unique name="UniqueObjectNameColor"> 
    <xs:selector xpath="./object" /> 
    <xs:field xpath="@name" /> 
    <xs:field xpath="@color" /> 
</xs:unique> 

... die Regel object Elemente ohne das optionale color Attribut ignoriert. Das folgende validiert richtig, während es nicht sollte.

<object name="ID2" /> 
    <object name="ID2" /> 

Können Sie mir sagen, wie kann ich eine Regel angeben, die einzigartige erzwingt name und color Kombinationen und, wenn das color Attribut in dem Element nicht vorhanden ist object, prüft er die name?

+0

ich die gleiche Sache wissen möchte. Die Antwortform von micfra schneidet es nicht ganz ab. –

+2

Es kann Ihr Schema brechen, aber setzt einen Standardwert für die Hilfe zum Farbattribut? z.B.

+0

@MattyK, das dieses Problem für mich behoben hat. Vielen Dank! – RichardTowers

Antwort

0

Alte Frage, aber es lohnt sich, beantwortet zu werden. Sie können mehr als eine unique Einschränkung pro Element verwenden. Dies würde das tun, was Sie wollen:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/xsdunique-with-optional-properties" 
    xmlns:tns="http://www.example.org/xsdunique-with-optional-properties" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectName"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
     </unique> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema> 
+2

Hi micfra, danke für deine Antwort. Ich möchte, dass dies gültig ist: '' Mit Ihrer Einschränkung 'UniqueObjectName' ist dies nicht gültig. Ich wollte nur exakte Kopien vermeiden: Nicht gültig: '' Nicht gültig: '' – Vitor

+0

Also habe ich deine Frage nicht richtig verstanden, aber es ist vielleicht erreichbar. – micfra

+0

Wenn Sie die Möglichkeit haben, zu XMl Schema 1.1 zu wechseln, können Sie zu Ihrer "object" -Definition hinzufügen. Ich bin damit nicht vertraut, also kann ich dir nicht weiter helfen. – micfra

4

Verwenden use und default mit oder ohne Wert wie:

<element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" use="optional" default="noColor" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema>