2011-07-26 5 views
8

için kısıtlama XSD'de bir eleman türü tanımlamaya çalışıyorum, bunun için isteğe bağlı bir öznitelik istiyorum, eğer varsa, bir float içerebilir veya boş olabilir (ancak hala mevcut).XSD: xs: float veya ""

yani:

<xs:element name="MyElement"> 
    <xs:complexType> 
     <xs:attribute name="optionalFloatAttribute" type="xs:float" use="optional"/> 
    </xs:complexType> 
</xs:element> 

İhtiyaçları "sabitleme" Aşağıdaki xml tamamının sağlayacağı: -

<MyElement/> 
or 
<MyElement optionalFloatAttribute=""/> 
or 
<MyElement optionalFloatAttribute="3.14159"/> 
Bunu yapmanın görebileceğiniz tek yolu xs:string türünü değiştirmektir

ve Normal bir ifadeyle xs:restriction kullanın. Ama bu benim için çok ideal görünmüyor. Daha iyi bir yolu var mı?

Ve xml bu varyasyonları desteklemek için muktedir sahip - programı ve mevcut xml mirası olduğunu ve çalışıyorum biz gerekeni içinde gördüğüm sayısız varyasyonları eşleştirmek için bir şema arka oluşturmak geçerli xml olarak değerlendir.

cevap

1

Bunun için bir yol olduğunu düşünmüyorum ve xs:float'u kullanın. Temel olarak boş dizenin geçerli bir sayı olmadığı gerçeğine iner. Normalde 0 değerini veya öğenin tamamen kaybolmasını beklersiniz. Aşağıdaki sorusu için iyi bir açıklama var: string ve regexp'in en iyi planı olabilir:

Empty elements for primitve datatypes forbidden in XSD

O xs kullanmanın seçenek gibi görünüyor.

4

Bir öznitelik yerine bir öğe kullanarak durabilirseniz, xs: float nillable yapabilirsiniz. Eğer xsi kullanabilirsiniz Bu şekilde: gerçi özellikler için

<!-- definition --> 
<xs:element name="quantity" type="xs:float" nillable="true" /> 

<!-- instance --> 
<quantity xsi:nil="true" /> 

Hayır eşdeğeri: senin örneğinin belgede nil = "true" öğesi hiçbir değeri olmadığını belirtmek için.

Sen float ve boş dize birleştirerek bunun için özel tipini tanımlayabilirsiniz
5

:

<xs:element name="MyElement"> 
<xs:complexType> 
    <xs:attribute name="optionalFloatAttribute" type="emptyFloat" use="optional"/> 
</xs:complexType> 
</xs:element> 
<xs:simpleType name="emptyFloat"> 
    <xs:union> 
     <xs:simpleType> 
      <xs:restriction base='xs:string'> 
       <xs:length value="0"/> 
      </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType> 
      <xs:restriction base='xs:float'> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 

Veya RegExp kullanarak: Sana `complexType` kullanarak özelliklere sahip aynı şeyi yapabilir varsayalım

<xs:simpleType name="emptyFloat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="-?\d*\.?\d*"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

s? Bu mükemmel bir cevap ve sorunumu çözdü. –