2011-07-26 93 views
8

我試圖在XSD中定義一個元素類型,爲此我想要一個可選屬性,如果存在可以包含浮點數或爲空(但仍然存在)。XSD:限制屬性爲xs:float或「」

即:

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

需要「修復」,讓所有遵循XML: -

<MyElement/> 
or 
<MyElement optionalFloatAttribute=""/> 
or 
<MyElement optionalFloatAttribute="3.14159"/> 

我可以看到這樣做的唯一方法是改變類型爲xs:string,和用正則表達式使用xs:restriction。但是這對我來說並不是很理想。有沒有更好的辦法?

而我能夠支持這些XML的變化 - 程序和現有的XML是遺留的,我試圖回創建一個模式,以匹配我看到我們必須的無數變化視爲有效的XML。

回答

1

我不認爲有辦法處理這個問題並使用xs:float。基本上,這歸結於空字符串不是有效的數字。你通常會期望值爲0,或者完全缺失該元素。有一個很好的解釋,回答以下問題:

Empty elements for primitve datatypes forbidden in XSD

看來,使用XS的選項:字符串和正則表達式可能是您的最佳方案。

4

如果你可以站在使用一個元素而不是一個屬性,你可以使xs:float nillable。這樣,您就可以使用XSI:您的實例文檔中無=「true」以表明該元素沒有值:

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

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

沒有類似的屬性,雖然。

5

您可以通過合併float和空字符串定義自定義類型爲:

<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> 

或者使用正則表達式:

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

我想你可以通過使用'complexType'做的屬性同樣的事情S'這是一個很好的答案,並解決了我的問題。 –