XML Schema 1.1,第 1 部分: XML Schema 1.1 简介

概述对 XML Schema 1.0 的重要改进并深入分析数据类型

随着 XML Schema 得到广泛采用以及用于各种用途,模式用户要求对 XML Schema 进行大量改进并提供新的功能。W3C XML 架构工作组开发了 XML Schema 1.1,可以满足最常见的用户要求,包括对 XML Schema 1.0 的一些缺陷的改进。本文是共分多部分的系列文章的第一篇,作者 Neil Delima、Sandy Gao、Michael Glavassevich 和 Khaled Noaman 将介绍 XML Schema 1.1,概述这个新兴标准引入的功能,并深入分析该规范的数据类型部分新增的内容和改变。

Neil Delima, 软件开发人员, IBM

Neil Delima 是 IBM 多伦多实验室的一位软件开发人员。作为 XML 解析器开发团队的成员,他从事 XML 技术的开发和测试已经超过 7 年了。他是 Apache 的 Xerces-Java 解析器项目的提交者之一,对 W3C DOM 和 XML 1.1 测试套件做出了突出贡献。



Sandy Gao, 软件开发人员, IBM

Sandy (Shudi) Gao 是 IBM 多伦多软件实验室的一位软件开发人员。他自 2001 年以来就成为了 Apache Xerces XML Parser (Java) 项目的提交者之一,并是该项目的 XML Schema 支持的重要贡献者之一。自 2003 年以来,Sandy 一直是 W3C XML 架构工作组中的 IBM 代表。他对 XML Schema version 1.1 开发做出了突出贡献,并于 2006 年成为了该规范的编辑。Sandy 也是 W3C SML 工作组中的 IBM 代表。



Michael Glavassevich, 软件开发人员, IBM

Michael Glavassevich 是 IBM 多伦多实验室的 XML 解析器开发团队的成员。他过去 5 年来一直是 Apache Xerces2 项目的主要贡献者之一,致力于研究 XML Schema、XInclude、JAXP 1.3/1.4 和 DOM Level 3 的实现。Michael 也是开发了 JAXP 1.4 的 JAXP 专家组的 IBM 代表。



Khaled Noaman, 软件开发人员, IBM

Khaled Noaman 是 IBM XML 解析器开发团队的成员之一。过去五年中参与了 Xerces-C++ 解析器的实现,实现了很多解析器特性,包括对 XML Schema Structure 的支持。



2009 年 2 月 05 日

简介

自 XML Schema 1.0 规范于 2001 年成为 W3C 推荐标准以来,开发人员社区一直在讨论该语言的优缺点。W3C XML Schema 工作组已经开始研究该语言的下一个版本。随着该标准被业界广泛采用并被整合到许多其他标准(包括 XSLT、XQuery 和 WSDL)中,在 2005 年,W3C 举行了一场研讨会,仔细研究了用户体验并收集了大量反馈,以帮助指导改进该语言。这场研讨会以及社区中其他用户提出的要求帮助 XML Schema 工作组确定了 XML Schema 1.1 版的范围。

常用缩写词

  • W3C:万维网联盟
  • WSDL:Web 服务描述语言
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

本文首先概述 XML Schema 1.1 的一些新特性,然后深入探讨对此规范的数据类型部分的增强。该标准现在的正式名称为 XML 模式定义语言或者简称为 XSD。我们将在本文以及整个系列中使用这个缩写词。有时候,当意图很明确时,“XML 模式” 和 “模式” 也都指的是这种语言。

读者需要注意,在编写本文时,XML Schema 1.1 仍然处在开发阶段。在 XML Schema 1.1 成为 W3C 推荐标准之前,一些细节可能会改变。

XML Schema 1.0 的不足

模式作者通常会遇到一些挑战。解决某些挑战可能会生成不太直观的模式设计;您也可能使用编程语言,通过代码应对其他挑战。

本节回顾一些最常遇到的问题,并讨论 XML Schema 1.1 如何帮助解决这些问题。本文后面的部分将进行详细讨论。

内容模型限制

复杂的类型可能具有不同种类的内容。要具备子元素,必须将 <xs:sequence><xs:choice><xs:all> 作为其内容模型。如果一个复杂类型是由对另一个类型的限制产生的,那么两种内容模型都必须满足特定的条件。指定这些条件是为了确保限制类型允许的元素也是基础类型所允许的。

在 XML Schema 1.0 中,这些条件使用一个含 25 个 case 语句的表指定,并且要满足这些条件,内容模型之间必须非常相似。这可能导致一些问题:

  • 25 个 case 语句指定的严格规则排除了一些明显有效的派生元素。
  • 规则允许一些明显无效的派生元素(也就是说,限制类型允许比基础类型更多的元素)。

例如,在 清单 1 中,类型 derived 移除了 base 类型的一个可选元素 tns:a。这明显是一个有效限制,但是在 XML Schema 1.0 中却是无效的。

清单 1. 派生类型删除了基础类型的一个可选元素
<complexType name="base">
  <complexContent>
    <sequence>
      <element ref="tns:a" minOccurs="0" maxOccurs="1"/>
      <choice minOccurs="0" maxOccurs="unbounded">
        <element ref="tns:b"/>
        <element ref="tns:c"/>
      </choice>
    </sequence>
  </complexContent>
</complexType>

<complexType name="derived">
  <complexContent>
    <restriction base="tns:base">
      <sequence>
        <choice minOccurs="0" maxOccurs="unbounded">
          <element ref="tns:b"/>
          <element ref="tns:c"/>
        </choice>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

XML Schema 1.1 取消了 25-case 规则,并替换为一个简单的概念,这个概念反映了 “限制类型允许的元素也是基础类型所允许的元素” 这一目标。上面的例子在 XML Schema 1.1 中是有效的。

共同约束

模式创作者经常希望实施涉及到多个元素或属性的规则。例如,“min 必须小于或等于 max”,或者 “子元素的数量必须与 size 属性匹配”。这类规则通常称为同现约束 或者称为共同约束

XML Schema 1.0 未提供任何工具来支持共同约束。用户有时候需要编写 Java™ 或 C 代码,以便将 XML 文档载入到内存之后进行检查。这将低了模式的可维护性和可互操作性。一些用户从其他 XML 验证语言(比如 Schematron 和 Relax NG)寻求帮助(参见 参考资料),希望获得共同约束支持,这使他们的基于 XSD 的模式变得更加复杂。

XML Schema 1.1 提供了对共同约束的原生支持。新引入的 <xs:assert> 元素能够包含使用 XPath 2.0(参见 参考资料)表达式指定的条件。清单 2 给出了一个例子:

清单 2. XML Schema 1.1 中的共同约束
<xs:complexType name="intRange">
  <xs:attribute name="min" type="xs:int"/>
  <xs:attribute name="max" type="xs:int"/>
  <xs:assert test="@min <= @max"/>
</xs:complexType>

模式演变

人们通常需要演变他们的模式,以添加扩展来获取新信息。通配符是一个强大的工具,能够出色地实现此目的。在早期模式版本中,可以使用通配符来引入扩展点,而在较新的版本中,可以在通配符的位置引入具体的元素。但是通配符具有一些比较严重的缺陷:

  • 争议很大的惟一粒子属性(Unique Particle Attribution,UPA)规则不允许使用可选的通配符。
  • 通配符难以表达 “除以下内容之外的所有内容” 的含义。
  • 在非常复杂的类型中重复使用同一个通配符,这使得整体模式扩展非常单调。

XML Schema 1.1 使模式演变变得非常简单。此外,通配符也得到了极大改进。当与明确指定的元素冲突时,它们不再违背 UPA,它们可以排除一组名称空间或一组名称,甚至可以设置默认通配符。编写可扩展模式比以前简单了许多。

例如,为了表示内容模型 “有且仅有一个名为 userName 的元素,但是可以有任意数量的任何其他元素,这些元素可以位于 userName 之前或之后”,可以定义如 清单 3 中所示的内容模型。

清单 3. XML Schema 1.0 中的内容模型
<xs:sequence>
  <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
  <xs:element ref="tns:userName"/>
  <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:sequence>

但是这个模型在 XML Schema 1.0 中是无效的。当遇到一个名为 userName 的元素时,难以确定它是与通配符 <xs:any> 匹配还是与元素声明 <xs:element> 匹配。为了解决此问题,一些人在通配符与该元素之间插入分隔符元素。这种方法虽然奏效,但是使模式和 XML 文档都变得非常难看。另一个问题是通配符也允许 userName,因此无法实现 “有且仅有一个” 的规则。

在 XML Schema 1.1 中,清单 3 中的模式片段是有效的,因为通配符的功能被减弱了,这意味着当一个元素可以匹配元素声明或通配符时,元素声明始终具有优先权。这避免了 UPA 问题。借助否定通配符(negative wildcard),现在可以表示 “有且仅有一个 userName,但可以有任意多个任何其他元素” 规则,如 清单 4 所示。

清单 4. XML Schema 1.1 中的内容模型
<xs:sequence>
  <xs:any minOccurs="0" maxOccurs="unbounded"
          processContents="skip" notQName="tns:userName"/>
  <xs:element ref="tns:userName"/>
  <xs:any minOccurs="0" maxOccurs="unbounded"
          processContents="skip" notQName="tns:userName"/>
</xs:sequence>

XML 模式数据类型

XML 模式规范包含两部分:结构和数据类型(参见 参考资料)。本节将讨论规范的数据类型部分中的一些变化,这些变化由 XML Schema 1.1 引入。在未来的文章中,我们将更详细地讨论结构部分的变化。

与 XQuery 1.0 和 XPath 2.0 数据模型类型保持一致

W3C XQuery 1.0、XPath 2.0、XSLT 2.0、XQuery 1.0 和 XPath 2.0 Data Model Recommendations(参见 参考资料)中使用的类型系统是 W3C XML Schema 1.0 Recommendation 的一个扩展。除了 XML Schema 1.0 内置的原始数据类型,这些规范还通过 XML Schema 1.0 名称空间定义了 5 种其他的数据类型,分别是:anyAtomicTypeuntypeduntypedAtomicdayTimeDurationyearMonthDuration。为了使 XML 模式和这些规范的数据类型保持一致,XML Schema 1.1 数据类型规范引入了 3 种数据类型,分别是:anyAtomicTypedayTimeDurationyearMonthDuration

anyAtomicType

anyAtomicType 是 XML Schema 1.1 内置的一个特殊的数据类型,由对 anySimpleType 的限制派生而来。因为 anyAtomicType 是所有原始数据类型的基础类型,anyAtomicTypes 的值和词汇空间(lexical spaces)是所有原始数据类型的值和词汇空间的联合。要更好地理解这个概念,请参见下面的 XML 模式(清单 5)和有效的 XML 文档(清单 6)。在这个例子中,一个 anyAtomicType 类型的元素可以包含一个字符串或整数作为有效值。也可以使用 xsi:type 将其转换为一种由 anyAtomicType 派生而来的特定类型。有一点需要指出,anyAtomicType 不定义任何约束 facet,因此您不能将它用作一个用户定义的简单类型的基础类型。

清单 5. anyAtomicType 的示例 XML 模式
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="test" xmlns:pfx="test">
   <element name="root">
      <complexType>
         <sequence>
            <element name="elanyAtomicType" type="anyAtomicType"
                     maxOccurs="unbounded"/>
         </sequence>
      </complexType>
   </element>
</schema>
清单 6. anyAtomicType 的示例 XML 文档
<pfx:root xmlns:pfx="test" xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <elanyAtomicType>Test</elanyAtomicType>
   <elanyAtomicType>12345</elanyAtomicType>
   <elanyAtomicType xsi:type="xs:string">Test</elanyAtomicType>
   <elanyAtomicType xsi:type="xs:integer">12345</elanyAtomicType>
</pfx:root>

yearMonthDuration

XML Schema 1.0 Datatypes Recommendation(参见 参考资料)中指定的 duration 数据类型是一个半序类型(partially ordered type),表示一个时间段。例如,持续时间值 P30D 和 P1M 是不能比较的,因为一个月可以包含 28 到 31 天中的任一天。为了使持续时间可比较,XML Schema 1.1 引入了两个新的全序类型,分别是:yearMonthDurationdayTimeDuration,这两种类型由对 duration 的限制派生而来。

在 XML Schema 1.1 中,yearMonthDuration 数据类型是通过将 duration 的词汇表示限制为仅包含年和月组件而派生得到的。可以使用正则表达式表示该数据类型:‘-?P[0-9]+(Y([0-9]+M)?|M)’。年和月组件的值可以是一个无符号整数。可选的减号表示一个负的 yearMonthDurationduration 数据类型的值空间包含一个表示月数的整数和一个表示秒数的小数。yearMonthDuration 数据类型的值空间是对 duration 数据类型的值空间的一个限制,它的秒属性为 0。

一个表示 1 年零 6 个月的正的 yearMonthDuration 值可以表示为词汇 P1Y6M 或 P18M。此 yearMonthDuration 的值为 18 个月。有效的 yearMonthDuration 值的示例包括 P1Y2MP12Y-P20M,而以下表示法是无效的:P-1YP1Y-1MP1YMyearMonthDuration 数据类型是一个全序数据类型。对于任意 2 个 yearMonthDurationsD1D2,都可以建立 D1D2 之间的排序关系。也就是说,既可以是 D1 > D2,也可以是 D1 < D2

用户定义数据类型可通过限制 yearMonthDuration 派生而来,通过指定 duration 允许的约束 facet 来实现。因为 yearMonthDuration 是通过限制 duration 得到的,所以其基本 facet 是半序的,派生之后并没有发生改变。但是 yearMonthDuration 实际上是全序数据类型。

dayTimeDuration

yearMonthDuration 类似,dayTimeDuration 数据类型由 duration 派生而来,通过将其词汇表示限制为仅包含 duration 数据类型的天和时间(小时、分钟和秒)组件来实现。这可以使用与正则表达式 [^YM]*[DT].* 匹配的持续时间来表示。天数、小时和分钟组件的值不受限制,支持任意的无符号 xs:integer。类似地,秒组件的值也支持任意的无符号 xs:decimal。可选的减号表示一个负的 dayTimeDurationdayTimeDuration 数据类型的值空间是对 duration 数据类型的一种限制,其月属性值为 0,并具有一个小数形式的秒数值。

正的 dayTimeDuration 值 “1 天、2 小时、3 分钟和 4.5 秒” 可以使用词汇 P1DT2H3M4.5S 表示。这个 yearMonthDuration 的值为 93784.5 (1*24*60*60+2*60*60+3*60+4.5) 秒。注意,如果天、小时、分钟和秒数为 0,则可以在词汇表示中省略它们,因为至少要提供 1 个值。如果 dayTimeDuration 只包含天数,那么必须省略标识符 T。其他有效 dayTimeDuration 的例子包括 P1DPT25HP22DT2HPT1H99M55S-PT20M-PT60.60S,无效 dayTimeDuration 的例子包括 P-5DP1D1M1H1SPDT1MP5H 以及 P1DT。与 yearMonthDuration 一样,dayTimeDuration 数据类型属于全序数据类型。

通过限制 dayTimeDuration 派生而来的数据类型可以指定与 duration 数据类型相同的约束 facet。注意,yearMonthDurationdayTimeDurationwhitespace facet 的值被固定为 collapse,而且无法更改。

清单 7 给出了一个有效的 XML Schema 1.1 片段,其中使用了 yearMonthDurationdayTimeDuration 数据类型。

清单 7. yearMonthDuration 和 dayTimeDuration 的示例 XML 模式
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="test" xmlns:pfx="test">
   <simpleType name="ymdBase">
      <restriction  base="yearMonthDuration">
         <minInclusive value="P1Y6M"/>
      </restriction>
   </simpleType>
   <simpleType name="ymdDerived">
      <restriction  base="ymdBase">
         <minInclusive value="P19M"/>
      </restriction>
   </simpleType>

   <simpleType name="dtdBase">
      <restriction  base="dayTimeDuration">
         <maxInclusive value="-P2DT2H"/>
      </restriction>
   </simpleType>
   <simpleType name="dtdDerived">
      <restriction  base="dtdBase">
         <maxInclusive value="-P51H"/>
      </restriction>
   </simpleType>

   <element name="root">
      <complexType>
         <sequence>
            <element name="elYearMonthDuration" type="ymdDerived"/>
            <element name="elDayTimeDuration" type="dtdDerived"/>
         </sequence>
      </complexType>
   </element>
</schema>

清单 7 展示了一个有效的 XML Schema 1.1 片段,其中使用了 yearMonthDurationdayTimeDuration 数据类型。简单类型 ymdDerived 限制了基础类型 ymdBase,而后者又使用 minInclusive facet 限制了 XML 模式 yearMonthDuration 内置数据类型。因为 yearMonthDuration 是全序数据类型,所以派生类型 ymdDerived 的值 P19M 比基础类型 ymdBase 的值 P1Y6M 大,这是一个有效的限制条件。类似地,简单类型 dtdDerived 限制了基础类型 dtdBase,而后者使用 maxInclusive facet 限制了 XML 模式 dayTimeDuration 内置数据类型。在这种情况下,派生类型 dtdDerived 的负的持续时间值 -P51H 比基础类型的值 -P2DT2H 小。元素 root 包含类型分别为 ymdDeriveddtdDerived 的子元素 elYearMonthDurationelDayTimeDuration

precisionDecimal

precisionDecimal 是 XML Schema 1.1 中引入的一种新类型,用于支持新的 IEEE-754 浮点十进制类型。它与 decimal 不同,因为精度十进制数不仅包含一个数字值,而且保留了一个算法精度。precisiontDecimal 还包含表示正无穷大(+INF)和负无穷大(-INF)的值,还包含一个非数字值(NaN)。它还区分正 0 (+0) 和负 0 (-0)。

precisionDecimal 的词汇空间是所有十进制数字(无论是否包含小数点)、科学(指数)表示法中的数字以及字符串 ‘INF’、‘+INF’、‘-INF’ 和 ‘NaN’ 的集合。

通过限制 precisionDecimal 派生而来的用户定义类型可以指定与 decimal 相同的约束 facet。此外,还引入了两个新的约束 facet maxScaleminScale,用于支持派生类型缩小 precisionDecimal 的值空间。maxScaleprecisionDecimal 的算法精度设置一个上限,而 minScale 设置一个下限。

清单 8 中,我们定义了一个新的 price 类型,该类型接受 -999,999.99999,999.99 之间的值。

清单 8. 使用 precisionDecimal 的示例 XML 模式片段
<xs:simpleType name='price'>
  <xs:restriction base='xs:precisionDecimal'>
    <xs:totalDigits value='8'/>
    <xs:minScale value='2'/>
    <xs:maxScale value='2'/>
  </xs:restriction>
</xs:simpleType>

在使用 NaN 时需要记住一点,这个值无法与任何值进行比较,包括它本身。因此,如果在任何范围 facet(minInclusivemaxInclusiveminExclusivemaxExclusive)中使用 NaN,最终将获得一个具有空的值空间的数据类型。

类似地,将 NaN 包含在枚举类型中也不会使其接受 NaN 值。如果想要在值空间中包含 NaN,可以定义一个联合类型,其中仅包含一个 NaN 数据类型(通过指定值为 “NaN” 的模式 facet 来实现)。

时区与时区偏移

XML Schema 1.0 规范中指定的与 datetimedateTime 相关的数据类型包含一个可选的时区,其形式为 (('+' | '-') hh ':' mm) | 'Z'。当将一个时区值添加到通用协调时间(Universal Coordinated Time,UTC)dateTime 时,将会生成该时区中的日期和时间。

尽管 XML Schema 1.0 规范使用了一个时区偏移概念,但它使用术语 “时区” 来表示时区偏移,这容易引起混淆,因为时区和时区偏移表示两个不同的概念。时区指的是一个特定位置或区域(例如太平洋时间),而时区偏移是 UTC 和一个特定时区之间的时间差距,用小时和分钟表示(例如,11:00-05:00)。XML Schema 1.1 规范纠正了这个问题,现在已经将时区和时区偏移区分开来。

闰秒

闰秒是向 3、6、10 或 12 月的最后一天添加的 1 秒,这意味着该月份的最后一天的最后一分钟不止 60 秒。添加闰秒是为了将 UTC 保持在观察到的天文时间的 0.9 秒范围内。

由于 XML Schema 1.1 规范中定义的与日期和时间相关的类型不支持闰秒,所以这些类型不能用来表示 UTC 中需要添加闰秒的日期的最后一秒。这类日期的一个例子就是 1972-06-30。如果有必要将闰秒计算在内,用户需要在应用程序级别上进行适当更改以处理这些日期。

实现定义的简单类型和 facet

XML 模式规范定义了许多原始类型,比如 stringbooleandouble,处理器可以理解这些类型并为其提供一个实现。许多系统需要的类型比规范中定义的内置类型更多。可以通过从现有类型派生新的类型来满足这类需求。

实现定义的原始类型

XML Schema 1.1 现在允许 XML 模式处理器的实现者定义自己的原始简单类型。可由每个 XML 模式处理器自行决定是否接受这些类型。

实现者需要遵循以下规则:

  • 使用 anyAtomicType 作为基础类型。
  • 决定应用哪些约束 facet,以及在应用时的含义(注意:必须包含一个 whiteSpace facet)。
  • 定义使用不同于 http://www.w3.org/2001/XMLSchema(此名称空间由 W3C 控制)的目标名称空间引用新类型的机制。
  • 定义新类型的词汇空间、值空间和词汇映射。
  • 定义相等关系。
  • 定义基本 facet 的值。

作为 XML 处理器的实现者,我们可以定义一个特殊的 date 数据类型,该类型遵循 “日-月-年” 的格式,也可以使用其他分隔符,不一定要使用连字符 (-)。与上面定义的规则一致,我们使用 anyAtomicType 作为基础类型,并定义一个新的名称空间,可能是 “http://www.example.com/XMLSchema-primitiveTypes”。我们想要使用以下格式表示日期:日、分隔符、月、分隔符、年。在 date 数据类型的词汇空间中,日、月和年的表示法与 XML Schema 1.1 中定义的表示法相同,而且遵循相同的规则。我们希望分隔符是以下 3 种值之一:句点 (.)、连字符 (-) 或斜杠 (/)。

我们还定义了将在实现中支持的 facet。这些基础 facet 可以包含以下 facet 和值:

  • ordered: partial
  • bounded: false
  • cardinality: countably infinite
  • numeric: false

依照规则,我们需要包含一个 whiteSpace facet,我们将使用值 “collapsed” 定义该属性,它适用于 date 和所有派生数据类型。依照 XML Schema 1.1 规范,我们还可以定义其他约束 facet 和值,比如:

  • pattern
  • enumeration
  • maxInclusive
  • maxExclusive
  • minInclusive
  • minExclusive
  • assertions
  • dateSeparator(由实现定义)

使用此定义,“2008-11-01”、“2008.11.01” 和 “2008/11/01” 都是日期的有效词汇表示,它们都表示同一天 “2008 年 11 月 1 日”。

实现定义的 facet

XML 模式规范定义了一组约束 facet(比如 minInclusivemaxLength),可以将这些内容应用于简单类型。约束 facet 是一种构造,可以在派生期间使用它们控制简单类型的值空间。模式感知处理器能够理解并支持这些约束 facet。

与实现定义的原始类型类似,XML Schema 1.1 允许实现者定义自己的约束 facet,XML 模式处理器可自行决定是否支持这些 facet。

下面是需要遵循的一些规则:

  • 定义 facet 的属性。
  • 定义 facet 的行为。
  • 定义使用不同于 http://www.w3.org/2001/XMLSchema(该名称空间受 W3C 控制)的名称空间引用新 facet 的机制。
  • 定义应用新的约束 facet 的原始类型。

清单 9 中,您将看到 XML 处理器实现者如何定义 dateSeparator facet,以限制实现定义的 date 及其所有派生数据类型的值空间中的分隔符。

清单 9. 实现定义的 facet 的示例
<dateSeparator
    fixed = boolean : false
    id  = ID
    value = '-' | '.' | '/'

    ...   >
  (optional element content here)
    ...
</dateSeparator>

facet 定义可以定义其他带有除 fixed, id,value 之外的非模式名称空间的属性。然后,任何派生数据类型都可以限制实现定义的 date 的值空间,方法就是应用 dateSeparator facet。

现在看一下用户如何使用这种实现定义的数据类型及其实现定义的 facet。在 清单 10 中,我们定义一个新类型 specialDate,使用新的 facet 来将 date 的表示限制为仅接受以斜杠 (/) 作为分隔符的值。

清单 10. 基于实现定义类型的派生类型示例
<xs:simpleType name="specialDate">
  <xs:restriction base="xyz:date">
    <xyz:dateSeparator value="/" />
  <xs:restriction>
</xs:simpleType>

现在,specialDate 只支持 “2008/11/01”,不支持 “2008-11-01” 和 “2008.11.01”。

结束语

本文概述了 XML Schema 1.1,重点讨论了 XML Schema 1.0 的不足并简要介绍了 XML Schema 1.1 如何改进这些缺点,还提供了大量与内容模型限制、共同约束和使用通配符进行模式演变相关的例子。然后深入讨论了对规范的数据类型部分的增强,包括新的数据类型,对实现定义的原始类型和 facet 的支持。本系列的第 2 部分将进一步探讨新的共同约束功能,具体包括断言和条件类型分配机制。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=368229
ArticleTitle=XML Schema 1.1,第 1 部分: XML Schema 1.1 简介
publish-date=02052009