2010-11-30 3 views
6

Mein Problem (oder Frage) konzentriert sich auf leere Elemente, die als xs: integer typisiert sind. Ich muss leere Elemente zulassen, also habe ich eine Union verwendet, um ein leeres Element oder eine gültige Ganzzahl als Wert zuzulassen, wie im Schema unten gezeigt. Mein Schema erfüllt jedoch eine doppelte Rolle und muss auch in Software von Drittanbietern importiert werden, die Datentypen wie String, Float, Integer oder Date erwartet. Wenn ich das Schema mit der union-Methode für alle Ganzzahlen codiere, werden sie nicht als Ganzzahlen in der Software eingegeben. Gibt es einen anderen Weg als die union-Methode, ein leeres Element für Integer-Datentypen zuzulassen? Ich möchte nur die eine XSD haben, aber zwei haben, wenn das ist, was passieren muss.XSD: Optionen zum Zulassen von Nullwerten beim Deklarieren von xs: Ganzzahl-Datentypen

Da XML Probe:

<?xml version="1.0" encoding="UTF-8"?> 
<company> 
    <division> 
     <department> 
      <roles/> 
      <employees>7</employees> 
     </department> 
    </division> 
</company> 

Und Schema:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:simpleType name="nullval"> 
     <xs:union memberTypes="IntegerType empty"/> 
    </xs:simpleType> 
    <xs:simpleType name="IntegerType"> 
     <xs:restriction base="xs:integer"/> 
    </xs:simpleType> 
    <xs:simpleType name="empty"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="0"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:element name="company"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="division"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="department" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <!-- elements may appear in any order --> 
            <xs:all minOccurs="0" maxOccurs="1"> 
             <xs:element name="roles" type="nullval"/> 
             <xs:element name="employees" type="xs:integer"/> 
            </xs:all> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Antwort

9

Haben Sie

versucht
<xs:element name="roles" type="xs:integer" nillable="true"/> 
+0

Ja, ich habe versucht sowohl nillable = "wahr" und minOccurs = "0" und es hat nicht funktioniert (mit XMLSpy mit Saxon). – johkar

+0

Haben Sie eine Kontrolle über das XML, das gesendet wird? Können Sie xsi: nil = "true" für das Rollenelement festlegen? (Ref. http://www.w3.org/TR/xmlschema11-1/#xsi_nil) – sho222

+0

Das ist ein guter Gedanke. Ja, ich habe Zugriff auf das XML. Es ist ziemlich großes XML und es gibt viele Elemente, die als Integer-Datentypen deklariert werden, also bin ich mir nicht sicher, ob ich diesen Weg gehen will. Es könnte einfacher sein, alle leeren Tags einfach zu entfernen, wenn ich einen zusätzlichen Durchlauf machen muss. Vielen Dank. – johkar

5

hallo der nillable = "true" und minOccurs = "0" funktioniert nur, wenn Sie das Tag überhaupt nicht senden. Wenn Sie jedoch einen leeren Wert innerhalb der Tags übergeben müssen, denke ich, dass Sie eine Union implementieren müssen.

0

Ich hatte heute die gleiche Anforderung. Folgende XSD erlaubt nur leer, oder einen Wert zwischen -1 und 999

Ich extrahiere nur die benötigten Sachen von einem sehr großen XSD, so dass einige von diesen wie Overkill aussehen könnten.

<xs:simpleType name="emptyString"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value=""/> 
    </xs:restriction> 
</xs:simpleType> 


<xs:simpleType name="int-1999"> 
<xs:restriction base="xs:int"> 
<xs:minInclusive value="-1"/> 
<xs:maxInclusive value="999"/> 
</xs:restriction> 
</xs:simpleType> 


<xs:element name="preNotificationPeriod" nillable="true"> 
    <xs:simpleType> 
    <xs:union memberTypes="int-1999 emptyString"/> 
    </xs:simpleType> 
</xs:element> 

Referenz - http://www.ilearnttoday.com/xsd-empty-values-and-range-restriction-for-numeric-types

More details on this article

+0

Scheint so, als ob beide Links nicht funktionieren. Seite könnte sich am wahrscheinlichsten bewegt haben. –

5

Was Sie tun müssen, zwei Einschränkungen auf demselben Element zuzuordnen ist, sowie eine Vereinigung von ihnen zu machen, wie im folgenden Beispiel:

<xs:element name='job_code'> 
    <xs:simpleType> 
    <xs:union> 
     <xs:simpleType> 
     <xs:restriction base='xs:string'> 
      <xs:length value='0'/> 
     </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType> 
     <xs:restriction base='xs:integer'> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
    </xs:simpleType> 
</xs:element> 

Mit dieser Einschränkung weisen Sie die XML-Validierung an, einen beliebigen ganzzahligen Wert zuzulassen und das Element zuzulassen, wenn es leer ist.

Verwandte Themen