首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用类型和模式改进您的 XSLT 2.0 样式表(1)

利用类型和模式改进您的 XSLT 2.0 样式表(1)

XML 内容可能是复杂的且难以预测。如果使用 XSLT 1.0 处理 XML 内容,在定义正确的表达式、处理所有可能出现的内容结构时,需要经历大量试错过程。举例来说,XPath 1.0 表达式中拼写错误的名称会导致不返回任何内容,而不是提供有用的错误消息,因而难以调试。
常用的首字母缩略词
  • HTML:超文本标记语言
  • XHTML:可扩展 HTML
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

与 1.0 版本相比,XSLT 2.0 取得了很大的进展,其中新增的强类型和模式感知都是非常有用的特性。在 XSLT 样式表中声明值类型使处理器能够告诉您:何时做出了有关 XML 内容数据类型、特定元素或属性的出现次数的错误假设。这项功能将提供更有用的错误消息。导入 XML 模式进一步加强了这项功能,为处理器提供充足的信息,使之能够了解输入文档结构,以便在出现无效的 XPath 时通知您,而非不返回任何内容。它们还提供了有关内容中数据类型的信息,避免对相应数据类型执行无意义的操作。
在 XSLT 中使用类型大多数编程语言都提供了指定变量或参数类型的方法。在 XSLT 2.0 中,您可以使用 as 属性声明表达式类型,该属性可出现在多个位置:
  • 在 xsl:variable 或 xsl:param 元素中,指明变量或参数的类型
  • 在 xsl:template 或 xsl:function 元素中,指明该模板或函数的返回类型
  • 在 xsl:sequence 元素中,指明序列类型
  • 在 xsl:with-param 元素中,指明传递给一个模板的值类型
as 属性的值也称为序列类型
使用 XML 模式的内置类型as 属性中常用的一种序列类型就是特定数据类型(例如字符串或者整数)的名称。在 XSLT 中,您可以使用 XML 模式规范内置的数据类型之一。为此,举例来说,您可使用 xs: 作为类型名称的前缀,并在样式表顶端声明 xs: 名称空间。 列举了最常用的 XML 模式数据类型。
表 1. 常用的 XML 架构数据类型数据类型名称描述示例string任意文本字符串abc 就是一个字符串integer任意大小的整数1, 2decimal小数1.2, 5.0double双精度浮点数1.2, 5.0dateYYYY-MM-DD 格式的日期2009-12-25timeHH:MM:SS 格式的时间12:05:04boolean真/假值真、假anyAtomicType任意简单类型的值字符串、123、假、2009-12-25
举例来说,如果希望将变量值声明为日期,我可以使用:
1
<variable name="effDate" select="bill/effDate" as="xs:date"/>




字符串和日期等简单值也称为原子值。请注意,如果 effDate 是一个元素,其内容将转换为 xs:date 类型的原子值(假设没有与此输入文档关联的模式)。
表示 XML 节点的序列类型您也可以使用  中的更为通用的序列类型,表示 XML 树中的节点类型。无需使用 xs: 作为这些序列类型的前缀,因为它们不属于 XML 模式类型。
表 2. 表示 XML 节点的序列类型序列类型描述element()任意元素element(book)名为 book 的任意元素attribute()任意属性attribute(isbn)名为 isbn 的任意属性text()任意文本节点node()任意种类的节点(元素、属性、文本节点等)item()任意种类的节点,或者任意种类的原子值(如字符串、整数)
举例来说,如果我想表示与一个变量绑定的值是一个元素,则可以说:
1
<variable name="effDate" select="//effDate" as="element()"/>




与上一个示例不同,此值不会转换为原子值;变量将包含元素本身。
使用出现次数指示符 (indicator)您还可以使用  所列的出现次数指示符,表示特定项目可能出现了多少次。这些出现次数指示符将出现在序列类型的末尾处,紧临  或者  的表达式之后。                       
表 3. 使用出现次数指示符出现次数指示符描述*零次到多次?零次到一次+一次到多次(无出现次数指示符)一次且仅一次
举例来说,如果我想表示与一个变量绑定的值是零到多个元素,则可以说:
1
<variable name="effDate" select="//effDate" as="element()*"/>




零个元素(或者任意种类的零个项目)也称为空序列
返回列表