2011-07-26 18 views
8

XSDで要素型を定義しようとしています。オプションの属性が必要です。存在する場合は、浮動小数点数を含むか、 )。XSD:属性をxs:floatまたは ""に制限します。

すなわち:次のXMLをすべて許可するように「固定」

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

ニーズ: - 私はこれを行うの見ることができます

<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を使用することができます:nilを=「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'を使用して属性を持つ同じことを行うことができます仮定?これは素晴らしい答えであり、私の問題を解決しました。 –