【问题标题】:XSD: Have a date element be either empty or meet restrictionsXSD:让日期元素为空或满足限制
【发布时间】:2015-09-11 14:31:32
【问题描述】:

我有一个 XSD,我需要一个日期元素为空或在某个日期(2015 年 10 月 1 日)之后。

因此,应该允许以下情况:

<DDate></DDate>
<DDate>2015-10-10</DDate>

我的 XSD 定义为:

<xs:element name = "DDate" nillable="true" >
    <xs:simpleType>
        <xs:restriction base="xs:date">
            <xs:minInclusive value="2015-10-01"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

这会强制日期正确,但不允许日期为空。任何见解或建议将不胜感激。

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

    你的定义已经允许一个空的DDate,除了一个限制,你还必须指定xsi:nil="true",像这样:

    <!-- ns decl. should go to the root element -->
    <DDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="xsd-date-empty.xsd" 
        xsi:nil="true" />
    

    但是,如果使用“允许空”,您的意思是您希望允许空白和/或空节点而不使用xsi:nil,有很多方法可以做到这一点。我可能会加入工会,像这样:

    <xs:element name = "DDate" nillable="true" >
        <xs:simpleType>
            <xs:union>
                <xs:simpleType>
                    <xs:restriction base="xs:date">
                        <xs:minInclusive value="2015-10-01"/>
                    </xs:restriction>        
                </xs:simpleType>            
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:whiteSpace value="collapse" />
                        <xs:length value="0" />
                    </xs:restriction>        
                </xs:simpleType>            
            </xs:union>
        </xs:simpleType>
    </xs:element>
    

    这意味着只允许一个:

    • 有 minInclusive 限制的日期
    • 空格折叠后为空的字符串

    【讨论】:

      【解决方案2】:

      通常,要在元素中允许“X 或无”,您有三个选项:

      (a) 声明元素可空。但这要求实例具有属性 xsi:nil='true'。我讨厌这种方法并且从不使用它,但为了完整起见,我提到它。

      (b) 将类型声明为 X 和长度限制为零的字符串的并集。 (正如亚伯建议的那样)

      (c) 将类型声明为 maxLength 1 的 X 列表。这往往是我自己的偏好。

      (b) 和 (c) 之间的选择可能取决于您如何使用架构。如果只是为了验证,两者都同样有效。如果它用于模式感知 XSLT 和 XQuery 处理,则列表类型效果更好,尽管联合开始在 3.0 版本中得到很好的支持。如果是用于 Java 或 C# 中的数据绑定,您将不得不问其他人,那不是我的领域。

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多