我正在尝试在XSD中定义一个元素类型,我想要一个可选属性,如果存在,可以包含一个浮点数,或者为空(但仍然存在)。
即:
<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。
答案 0 :(得分: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>
或使用regExp:
<xs:simpleType name="emptyFloat">
<xs:restriction base="xs:string">
<xs:pattern value="-?\d*\.?\d*"/>
</xs:restriction>
</xs:simpleType>
答案 1 :(得分:4)
如果您可以使用元素而不是属性,则可以使xs:float nillable。这样,您可以在实例文档中使用xsi:nil =“true”来指示该元素没有值:
<!-- definition -->
<xs:element name="quantity" type="xs:float" nillable="true" />
<!-- instance -->
<quantity xsi:nil="true" />
虽然没有等效的属性。
答案 2 :(得分:1)
我认为没有办法处理这个并使用xs:float
。从根本上说,它归结为空字符串不是有效数字。您通常期望值为0,或者元素完全丢失。作为以下问题的答案有一个很好的解释:
Empty elements for primitve datatypes forbidden in XSD
似乎使用xs:string和regexp的选项可能是你最好的计划。