XSD:restrict属性为xs:float或"&引用;

XSD:restrict属性为xs:float或"&引用;,xsd,Xsd,我试图在XSD中定义一个元素类型,我想要一个可选的属性,如果存在,该属性可以包含一个float,也可以是空的(但仍然存在) i、 e: 需要“修复”以允许以下所有xml:- <MyElement/> or <MyElement optionalFloatAttribute=""/> or <MyElement optionalFloatAttribute="3.14159"/> 或 或 我能看到的唯一方法是将type更改为xs:string,

我试图在XSD中定义一个元素类型,我想要一个可选的属性,如果存在,该属性可以包含一个float,也可以是空的(但仍然存在)

i、 e:


需要“修复”以允许以下所有xml:-

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

或
或
我能看到的唯一方法是将type更改为
xs:string
,并将
xs:restriction
与正则表达式一起使用。但这对我来说似乎不太理想。有更好的办法吗


我必须能够支持xml的这些变体——程序和现有xml都是遗留的,我正在尝试反向创建一个模式,以匹配我在我们认为有效的xml中看到的无数变体。

我认为没有办法处理这个问题并使用
xs:float
。从根本上讲,它归结为一个事实,即空字符串不是一个有效的数字。您通常期望值为0,或者该元素完全丢失。以下问题的答案有一个很好的解释:


似乎使用xs:string和regexp的选项可能是您的最佳方案。

如果您可以使用元素而不是属性,则可以使xs:float为nillable。通过这种方式,您可以在实例文档中使用xsi:nil=“true”来指示元素没有值:

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

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


但是属性没有等效项。

您可以通过组合浮点和空字符串来定义该属性的自定义类型:

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

或使用regExp:

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

我假设您可以使用
complexType
s对属性执行相同的操作?这是一个很好的答案,解决了我的问题。
<xs:simpleType name="emptyFloat">
    <xs:restriction base="xs:string">
        <xs:pattern value="-?\d*\.?\d*"/>
    </xs:restriction>
</xs:simpleType>