定义必须为空或十进制的XML元素

时间:2016-06-09 16:06:35

标签: xml xsd nullable

我有一个由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才能允许这个?

3 个答案:

答案 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描述的方法应该可以正常工作。