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