XSD:将属性限制为xs:float或""

sli*_*yr4 8 xsd

我正在尝试在XSD中定义一个元素类型,我想要一个可选属性,如果存在,可以包含一个浮点数,或者为空(但仍然存在).

即:

<xs:element name="MyElement">
    <xs:complexType>
        <xs:attribute name="optionalFloatAttribute" type="xs:float" use="optional"/>
    </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

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

<MyElement/>
 or
 <MyElement optionalFloatAttribute=""/>
 or
 <MyElement optionalFloatAttribute="3.14159"/>
Run Code Online (Sandbox Code Playgroud)

我能看到这样做的唯一方法是将类型更改为xs:string,并使用xs:restriction正则表达式.但这对我来说似乎并不理想.有没有更好的办法?

而且我必须能够支持xml的这些变体 - 程序和现有的xml是遗留的,我试图反向创建一个模式,以匹配我在我们必须视为有效的xml时看到的无数变体.

Vic*_*tor 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>
Run Code Online (Sandbox Code Playgroud)

或者使用regExp:

<xs:simpleType name="emptyFloat">
    <xs:restriction base="xs:string">
        <xs:pattern value="-?\d*\.?\d*"/>
    </xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)


Jon*_*ton 1

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

XSD 中禁止使用原始数据类型的空元素

看来使用 xs:string 和正则表达式的选项可能是您最好的计划。