2016-06-09 1 views
1

Ich habe sein müssen, die von VS aus einem Beispiel XML-Datei generiert wurde:Definieren eines XML-Element, das die folgenden XSD leer oder dezimal

   <xs:element name="amperage_rating"> 
        <xs:complexType> 
        <xs:simpleContent> 
         <xs:extension base="xs:decimal"> 
         <xs:attribute name="unit" type="xs:string" use="required" /> 
         </xs:extension> 
        </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 

, die einen numerischen Wert verlangt. Aber manchmal ist der Wert nicht bekannt ist, und dies muss auch erlaubt sein:

<amperage_rating unit="A"></amperage_rating> 

Ich habe versucht nillable = „true“, aber es hatte keine Wirkung. Ich habe auch versucht, eine Union mit einer 0-length-Zeichenfolge zu definieren, aber das sagt immer, dass es "in diesem Kontext nicht unterstützt wird".

Wie kann ich die XSD anpassen, um dies zu ermöglichen?

Antwort

1

können Sie kombinieren die beiden Typen, die Sie über xs:union zulassen möchten:

<xs:element name="amperage_rating" type="empty_or_decimal"/> 

<xs:simpleType name="empty_or_decimal"> 
    <xs:union memberTypes="empty xs:decimal"/> 
</xs:simpleType> 

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

zwei Ansätze Es gibt keine. Einer davon ist, was @kjhughes vorschlägt: Definieren Sie eine Union zwischen xs:decimal und einem Nulllängen-String-Typ. Die andere, die ich persönlich bevorzuge, besteht darin, einen Listentyp mit dem Elementtyp xs:decimal und maxLength 1 zu definieren. Obwohl die Auswirkung auf die Validierung genau gleich ist, ist der Listentyp einfacher zu verwenden, wenn das Schema für die Datentypisierung verwendet wird: sicherlich mit XSLT und XQuery, wo das Atomisieren des Elements eine Folge von null oder einer Dezimalstelle ergibt.

1

Es klingt, als wäre Ihr Anwendungsfall einigen motivierenden Fällen für xsi: nil sehr ähnlich. Aus Ihrer Beschreibung, es klingt, als ob Sie das Element nillable gemacht, aber fütterte es dann eine nicht-nilled Instanz des Formulars

<amperage_rating unit="A"></amperage_rating> 

statt Angabe, dass das Element nilled werden soll:

<amperage_rating unit="A" xsi:nil="true"></amperage_rating> 

Wenn Sie den Typ ändern möchten, sollten die von kjhughes und Michael Kay beschriebenen Methoden gut funktionieren.

Verwandte Themen