我有一个由VS从示例XML文件生成的以下XSD:
<xs:element name="amperage_rating">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="unit" type="xs:string" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
需要数值。但有时价值未知,这也必须允许:
<amperage_rating unit="A"></amperage_rating>
我尝试过nillable =“true”但它没有效果。我还试图用一个0长度的字符串定义一个联合,但一直说它“在这种情况下不支持”。
那么如何调整XSD才能允许这个?
答案 0 :(得分:1)
您可以通过xs:union
组合您希望允许的两种类型:
<xs:element name="amperage_rating" type="empty_or_decimal"/>
<xs:simpleType name="empty_or_decimal">
<xs:union memberTypes="empty xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="empty">
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
答案 1 :(得分:1)
有两种方法。一个是@kjhughes建议的:定义make
和零长度字符串类型之间的联合。我个人更喜欢的另一个是定义项类型为xs:decimal
和maxLength 1的列表类型。虽然对验证的影响完全相同,但我认为使用模式时列表类型更容易使用对于数据类型:当然使用XSLT和XQuery,其中雾化元素将给出一个零或一位小数的序列。
答案 2 :(得分:1)
听起来好像你的用例非常像xsi:nil的一些激励案例。根据您的描述,听起来好像您将元素设为nillable,但随后将其提供给表单的非填充实例
<amperage_rating unit="A"></amperage_rating>
而不是指定元素应该被填充:
<amperage_rating unit="A" xsi:nil="true"></amperage_rating>
如果你想修改类型,kjhughes和Michael Kay描述的方法应该可以正常工作。