XPath 1.0 介绍

Switch 脚本 API 中使用 XPath 1.0 查询 XML 和 JDF 数据模块和 XML 模块中的 XML 文档内容。

注: Switch 当前版本不支持 XPath 2.0。

有关 XPath 1.0 的全部详情,请参阅 XPath 1.0 规范、XML 1.0 规范、XML 名称空间规范和普遍可用的相关文档。

下文简单介绍了 XPath 1.0 一个很小的子集。

表达式和位置路径

XPath 将 XML 文档显示为节点树。存在不同类型的节点,包括元素节点、属性节点和文本节点。XPath 定义在节点树中引用特定节点的方法,计算每种类型节点的字符串值并使用这些值来进行更常规的计算。

XPath 最主要的部分是表达式。计算表达式以生成对象,对象为以下四种基础类型之一:

位置路径是一种重要的表达式。位置路径选择一组节点。位置路径表达式的计算结果为包含位置路径选择的节点的节点集。位置路径可以递归方式包含用来过滤节点集的表达式。

位置路径

位置路径是一系列一个或多个以斜杠隔开的位置步骤。每个位置步骤轮流(从左至右)选择一组与上个步骤决定的上下文节点相关的节点。初始的上下文节点由位置路径的上下文决定(因数据模块在 Switch 中查询,上下文节点永远是文档的根节点;在 XML 模块中,则是正在查询的节点)。位置路径前的斜杠将位置路径变成绝对路径,即,"/" 代表了文档的根节点。

以下是位置路径的例子:

para

选择上下文节点的 para 子元素

*

选择上下文节点的所有子元素

text()

选择上下文节点的所有文本子元素

@name

选择上下文节点的名称属性

@*

选择上下文节点的所有属性

para[1]

选择上下文节点的第一个 para 子元素

para[last()]

选择上下文节点的最后一个 para 子元素

*/para

选择上下文节点的所有 para 孙元素

/doc/chapter[5]/section[2]

选择 doc 文档元素中第五章元素的第二小节元素

chapter//para

选择上下文节点的章节子元素中的 para 后裔元素

//para

选择文档根节点中所有 para 后裔元素再选择同一文档(作为上下文节点)中所有 para 元素

//olist/item

选择同一文档(作为上下文节点)中所有有 olist 父元素的项目元素

.

选择上下文节点

.//para

选择上下文节点的 para 后裔元素

..

选择上下文节点的父元素

../@lang

选择上下文节点父元素的 lang 属性

para[@type="warning"]

选择上下文节点中所有类型属性带值警告的 para 子元素

para[@type="warning"][5]

选择上下文节点中类型属性带值警告的第五个 para 子元素

para[5][@type="warning"]

如上下文节点中第五个 para 子元素类型属性有带值警告,选择该子元素

chapter[title="Introduction"]

选择上下文节点中有一个以上标题子元素带有等于 Introduction 的字符串值的章节子元素

//field[name="JobID"]/value

选择文档中所有父域元素和同级名称元素带有等于 JobID 的字符串值的值元素

chapter[title]

选择上下文节点中有一个以上标题子元素的章节子元素

employee[@secretary and @assistant]

选择上下文节点中所有带秘书属性和助手属性的雇员子元素

表达式

上节列出的位置路径包含几个简单的使用过滤器节点的表达式示例(如 @type="warning" 是用于过滤出带特定属性值的元素)。表达式可依赖自己本身,也可用来表达基于位置路径结果的计算。XPath 提供了有限的使用表达式功能。

以下是表达式示例:

para

结果为 para 元素的文本内容

@type

结果为类型属性的文本内容

(2 + 3) * 4

结果为数字 20

number(@type) > 10

如类型属性代表的数字大于 10,结果为真;否则为假

count(//field)

结果为文档中的域元素数量,忽略这些元素在节点树中的位置

count(/doc/chapter[5]/section)

结果为 doc 文档元素中第五章元素的小节元素数量

string-length(normalize-space(para))

结果为 para 元素文本内容中的字符数量(移除开头和末尾白色空格并用单独的空格代替一些列白色空格字符后)

名称空间

上例假设了被查询的 XML 文档不使用名称空间。实际上,很多 XML 文档都会使用名称空间,避免不同类型和源头混合时存在冲突元素和属性名称。

名称空间用 Unique Resource Identifier (URI)区分。URI 类似于网页地址,但实际只是一个唯一的字符串(大多数 URI 不指向实际的网页)。元素和属性名称使用名称空间前缀(作为简写)指向名称空间而非每次重复 URI。XML 文件中的名称空间声明中定义了名称空间前缀和名称空间 URI 之间的映射关系。

例如:

xml:lang

用来表示自然语言的标准 XML 属性名称

jdf:node

是 JDF 规范中的节点元素名称,假设 jdf 前缀映射到 JDF 名称空间的 URI

名称空间和 XPath

如被查询的 XML 文件使用名称空间,XPath 表达式和位置路径同样要使用名称空间前缀。前缀和对应的名称 URI 之间的映射必须单独通过查询功能,因为映射信息无法用 XPath 表达。

注意名称空间 URI 必须匹配 Xpath 表达式和 XML 文件;名称空间的前缀可能不同。

XPath 没有默认名称空间的概念。如被查询的 XML 文件定义了默认的名称空间,XPath 表达式必须指定一个名称空间前缀来指向该名称空间的元素。default_switch_ns 前缀可用来指定使用默认名称空间的元素。