XSD使属性可以为空

时间:2012-08-18 21:40:19

标签: xml xsd

创建XML时,属性wait可能并不总是包含值。如何编辑架构以使属性wait包含数字或无值?

<xs:complexType name="CommandType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="exe" use="required" />
                <xs:attribute type="xs:string" name="args" use="required" />
                <xs:attribute type="xs:int" name="wait" use="required" />
                <xs:attribute type="xs:string" name="expectedOutput" use="required" />
                <xs:attribute type="xs:string" name="toVariable" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

我已尝试同时执行这两项nillable="true" xsi:nil="true"但它们不起作用。当我尝试验证XSD时,我遇到了错误。

2 个答案:

答案 0 :(得分:3)

“nillable”仅适用于元素,不适用于属性 - 即使这样也不是很有用,因为如果元素为空,则必须添加xsi:nil =“true”,这是完全冗余的。

要么(a)定义一个类型,它是xs:integer和零长度字符串的并集,如IMSoP所建议的,或者(b)定义一个列表类型,其项目类型为integer,minLength 0,maxLength 1.我更喜欢后一种解决方案,因为它可以更好地使用模式感知的XSLT和XQuery。

答案 1 :(得分:0)

可能有一种更简单的方法,但也许您可以使用xs:int类型创建一个空字符串或符合union定义的自定义类型:

<xs:simpleType name="emptyString">
    <xs:restriction base="xs:string">
        <xs:length value="0" />
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="intOrEmpty">
    <xs:union memberTypes="xs:int emptyString" />
</xs:simpleType>

顺便提一下,值得记住xs:string类型包含空字符串,因此,如果exe属性应始终具有非空值,则需要nonEmptyString类型(使用minLength限制)并将其标记为required。我知道过去让我感到很不舒服。