2016-04-03 9 views
2

Ich hätte gerne eine Beschränkung auf xsd:complexType was würde nur Werte zwischen 0.5 bis 20 enthalten, beide enthalten, mit Schritt von 0.5. Es bedeutet Zahlen:XSD erlauben Doppel um die Hälfte

0.5 1 1.5 2 2.5 3 3.5 .. up to 20 

Mein Code ist hier:

<xsd:complexType name="skillType"> 
    <xsd:simpleContent> 
     <xsd:extension base="skillHalfDoubleType"> 
      <xsd:attribute name="special"> 
       <!-- Irrelevant attribute --> 
      </xsd:attribute> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

<xsd:simpleType name="skillHalfDoubleType"> 
    <xsd:restriction base="xsd:double"> 
     <!-- What more? --> 
    </xsd:restriction> 
</xsd:simpleType> 

Es ist möglich, es mit Regex auf xsd:string angewendet zu tun, jedoch sehe ich für die Lösung mit xsd:double zu beschränken.

Antwort

2

Mit XML Schema 1.1 können Sie eine Assertion schreiben, die die Werte

<xs:simpleType name="skillHalfDoubleType"> 
    <xs:restriction base="xs:double"> 
     <xs:assertion test="$value = (for $d in 1 to 40 return 0.5 * $d)"></xs:assertion> 
    </xs:restriction> 
</xs:simpleType> 
+2

Oder Sie könnten eine minInclusive Facette, eine maxInclusive Facette und die Assertion Facette 'round ($ value * 2) = $ value * 2 haben 'um zu testen, dass es ein Vielfaches von 0,5 ist. –

3

Eine einfache (wenn auch ausführlich) Lösung wäre eine Aufzählung zu verwenden:

<xs:enumerationvalue="0.5"/> 
<xs:enumerationvalue="1"/> 
<xs:enumerationvalue="1.5"/> 
... 

Eine elegantere Lösung wäre, ein Muster mit min und maxInclusive kombiniert zu verwenden:

<xs:minInclusivevalue="0"/> 
<xs:maxInclusivevalue="20"/> 
<xs:pattern value="([1-9]?[0-9])|([1-9]?[0-9].5)"/> 

die letztere ermöglicht einfachere Bereichsanpassungen, kann aber einige schemabewusste Vorschlagsanbieter verwirren, wie CM Sperberg-McQueen betont.

+0

Ja beschränkt, eine ganz straighforward Weise. Es ist verwendbar, bis ich meine Meinung ändere und von "0.5" zu "100" benötige. Jedoch +1 für eine Lösung :) –

+0

Ja, ein Muster funktioniert auch, obwohl schemafähige Software, die Vorschläge erzeugt, Muster oft schwerer zu handhaben finden wird als Aufzählungen. Wenn das Muster weniger restriktiv gemacht wird (zB '. * (\. [05] 0 *'), kann man vermeiden, mehr zu sagen, als beabsichtigt war; das OP erwähnte keine Vorschrift, führende Zeichen oder führende und nachfolgende Nullen zu verbieten macht es auch einfacher, den Bereich zu ändern –

+0

Danke für die Bestätigung, ich habe die Antwort aktualisiert –