一、XML基础
1、元素
元素构成 XML 文档的主体,创建可以使用程序或样式表处理的结构。元素标识命名的信息节,并使用标记构建,标识元素的名称、开始和结束。元素还可以包含属性名称和值,用于提供有关内容的其他信息。
元素名称
所有元素必须有名称。元素名称区分大小写,并且必须以字母或下划线开头。元素名称可以包含字母、数字、连字符、下划线和句点。
开始标记、结束标记和空标记
标记设置元素内容(如果有)的边界。
开始标记指示元素的开头,使用以下常规语法。
<elementName att1Name="att1Value" att2Name="att2Value"...>
对于没有属性的元素,可以缩短开始标记。<elementName>
结束标记指示元素的结尾,不能包含属性。结束标记总是采用以下格式。
</elementName>
一般认为,元素包括开始标记和结束标记以及两个标记之间的所有内容。
<person><givenName>Peter</givenName> <familyName>Kress</familyName></person>
在此例中,<person> 元素包含两个其他元素 <givenName> 和 <familyName> 以及用于分隔这两个元素的空格。<givenName> 元素包含文本 Peter,而 <familyName> 元素包含文本 Kress。空标记用于指示没有文本内容的元素,不过这些元素可以有属性。HTML img 和 br 元素就属于空元素。如果文档的开始标记和结束标记之间没有内容,空标记可以作为快捷方式使用。空标记看起来与开始标记类似,只是在结束 > 之前包含斜杠 (/)。
<elementName att1Name="att1Value" att2Name="att2Value".../>
在 XML 中,可以使用开始标记和结束标记指示空元素,两个标记之间没有空白或内容,例如 <giggle></giggle>,也可以使用空标记,例如 <giggle/>。在 XML 分析器中,两种格式产生的结果相同。
元素关系
元素之间的关系使用族或树环境说明。XML 文档必须包含一个空格(也称为根元素)。尽管该空格的前面和后面可以接其他标记(例如声明、处理指令、注释和空白),但是根元素必须包含被认为属于文档本身的所有内容。例如,以下代码可以作为 XML 文档,文档元素 <person> 作为其根元素。
<person><givenName>Stephanie</givenName> <familyName>Bourne</familyName></person>
在树环境中,叶是指不包含任何其他元素的元素,就像树枝末端的树叶一样。叶元素通常只包含文本或根本不包含任何内容;叶节点通常是空元素或文本。在文档映射中,介绍书籍的所有文本存储在叶元素中;文本本身就是叶节点。族环境(例如父、子、上级、子代和同辈)用于说明元素之间的相对关系,不必相对于整个文档。以下摘要示例文档说明元素之间的关系。
2、序言
序言引用在文档或根元素的开始标记之前出现的信息。包括应用于整个文档的信息,例如字符编码、文档结构和样式表。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<!--catalog last updated 2000-11-01-->
3、XML 声明
XML 声明通常在 XML 文档的第一行出现。XML 声明不是必选项,但是如果使用 XML 声明,必须在文档的第一行,前面不得包含任何其他内容或空白。
文档映射中的 XML 声明包含下列内容:
版本号 <?xml version="1.0"?>。
编码声明 <?xml version="1.0" encoding="UTF-8"?>。
XML 声明还可以包含独立声明,例如 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>。与编码声明类似,独立声明也是可选项。
编码声明
编码声明标识用于表示文档中的字符的编码。尽管 XML 分析器可以自动确定文档使用的是 UTF-8 还是 UTF-16 Unicode 编码,但是,在支持其他编码的文档中应使用此声明。
独立声明
独立声明指示文档的内容是否依赖来自外部源的信息,例如外部文档类型定义 (DTD)。如果独立声明包含值 "yes",例如 <?xml version="1.0" standalone="yes"?>,在文档引用外部 DTD 或外部实体时,分析器将报告错误。省略独立声明与包含独立声明 "no" 的结果相同。XML 分析器将接受外部源(如果有)而不报告错误。
4、处理指令
处理指令可以用于将信息传递给应用程序,其方式是转义大多数 XML 规则。处理指令不必遵守许多内部语法。处理指令可以包括未转义的标记字符,可以出现在文档中其他标记以外的任意位置。处理指令可以出现在序言中,包括文档类型定义 (DTD);可以出现在文本内容中或文档之后。架构或 DTD 处理器不会记录处理指令的出现。处理指令必须以称为目标的标识符开头,遵循的规则与元素名和属性名类似。处理指令目标区分大小写,并且必须以字母或下划线开头。目标的其他部分可以包含字母、数字、连字符、下划线、句点和冒号。任何有效的 XML 文本字符均可以出现在该目标之后。
以下是文档映射中的处理指令语法。
<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>
内容的处理在遇到字符串 ?> 之后立即结束
样式表处理指令
根据 W3C 的建议,Microsoft? Internet Explorer 实现了 xml-stylesheet 处理指令。此处理指令必须出现在序言中,在文档元素或根元素之前。可以出现多个处理指令,这对于层叠样式表可能很有用,但是大多数浏览器使用第一个支持的样式页,忽略其他样式页。
样式页处理指令的语法如下所示:
<?xml-stylesheet type="type" href="uri" ?>
type 是 text/css(链接到层叠样式表文件)或 text/xsl(链接到 XSLT 文件)
uri 是样式表的统一资源标识符 (URI)。此 URI 相对于 XML 文档本身的位置。
以下 xml-stylesheet 处理指令用于标识使用层叠样式表构建的样式表。
<?xml-stylesheet href="/style.css" type="text/css" title="default stylesheet"?>
以下处理指令是合法的,但是应用程序很难处理。
<?style – oh, try /style.css ?>
许多处理指令使用伪属性内容,类似属性,并且应用程序更容易处理。前面的示例可以使用 W3C xml-stylesheet 处理指令替代:
<?xml-stylesheet href="/style.css" type="text/css" title="default stylesheet"?>
可以在序言中使用处理指令来指定其他文档范围的处理,但是必须编写应用程序来支持这些处理指令。
5、DOCTYPE 声明
DOCTYPE 声明为文档提供一个空间,通过引用外部文件、通过直接声明或通过这两种方式来标识其根元素和文档类型定义
DOCTYPE 声明可以包含下列内容:
文档或根元素的名称:如果使用 DOCTYPE 声明,此内容是必选项
可以用于验证文档结构的 DTD 系统标识符和公共标识符:如果使用公共标识符,必须同时提供系统标识符
DTD 声明的内部子集:内部子集出现在方括号 ([ ]) 之间
如果文档要在验证环境中进行处理,DOCTYPE 声明是必选项。要生效,DOCTYPE 声明必须标识与文档的文档结构对应的 DTD。非验证分析器将接受没有 DOCTYPE 声明的文档
最简单的 DOCTYPE 声明只标识文档的根元素。
<!DOCTYPE rootElement>
更常见的情况是,使用 DOCTYPE 声明的文档引用包含组成 DTD 的声明的外部文档。以下内容可以用于标识外部 DTD
<!DOCTYPE rootElement SYSTEM "URIreference">
URIreference 指向包含声明的文件。
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">
PublicIdentifier 提供一个独立的标识符,有些 XML 分析器可以使用该标识符引用 DTD,代替 URIreference。如果使用分析器的系统没有网络连接,或该连接可能会明显减慢处理速度,可以使用此标识符。DOCTYPE 声明还可以在内部子集中直接包含声明。如果 DOCTYPE 声明直接包含整个 DTD,而没有引用外部文件,将使用以下语法。
<!DOCTYPE rootElement [
declarations
]>
6、XML 注释
并非用于 XML 分析器的内容(例如与文档结构或编辑有关的说明)可以包含在注释中。注释以 <!-- 开头,以 --> 结尾,例如 <!--catalog last updated 2000-11-01-->。
注释可以出现在文档序言中,包括文档类型定义 (DTD);文档之后;或文本内容中。注释不能出现在属性值中。不能出现在标记中。
分析器在遇到 > 时,就认为注释已结束;然后继续将文档作为正常的 XML 处理。因此,字符串 > 不能出现在注释中。除了该限制之外,任何合法的 XML 字符均可以出现在注释中,与 CDATA 节非常类似。这样,可以从分析器看到的输出流中删除 XML 注释,同时又不会删除文档的内容。
以下注释可以用于暂时除去标记。
<!--- <test pattern="SECAM" /><test pattern="NTSC" /> -->
7、文本内容
因为 XML 支持 Unicode 字符集,所以支持各种字符,包括字母、数字、标点和符号。大多数控制字符和 Unicode 兼容性字符都不允许使用
因为 XML 使用 <、> 和 & 来分隔标记,所以,应按照以下主题所述,使用字符和实体引用来呈现这些字符,或只在 CDATA 节使用这些字符
8、字符和实体引用
通过字符和实体引用,可以通过引用将信息加入 XML 文档,而不必直接在文档中键入字符。在下列情况下,这样做很有用:
因为会被解释为标记,字符无法直接输入文档。
因为输入设备的限制,字符无法直接输入文档。
字符无法通过限于单字节字符的处理器可靠地传输。
字符串或文档片断反复出现,并且可以缩写。
为了显示内容,XML 提供了许多语法构造,以“and”符 (&) 开头,以分号 (;) 结尾通过字符引用,可以插入通过指向 Unicode 代码点的数字标识的 Unicode 字符。代码点可以使用十进制或十六进制表示法标识。
& #value;
用于十进制引用的语法。
&# xvalue;
用于十六进制引用的语法。
下表为 XML 标记使用的字符列出了五种内置实体。
lt < <(小于号)
gt > >(大于号)
amp & &(“and”符)
apos ' '(撇号或单引号)
quot " "(双引号)
如果字符可能会使 XML 分析器错误地解释文档结构,请使用实体,而不要键入字符。' 和 " 实体引用最常用在属性值中。
例如,要写入 Me&You,请使用 Me&You。对于 a<b,请使用 a<b。对于 b>c,请使用 b>c。
还可以定义自己的实体,与 HTML 定义在 HTML 中使用的实体集非常类似。&apos 无法作为 HTML 文件识别;在转换为 HTML 时必须使用 $#....。
如果使用的文档类型定义 (DTD) 已定义了实体,可以使用以下语法在文档内容中引用这些实体。
&entityName;
9、CDATA 节
通过 CDATA 节可以通知分析器 CDATA 节包含的字符中没有标记。这样,如果文档包含可能会出现标记字符、但是不应出现标记的节,创建这样的文档要容易得多。CDATA 节常用于脚本语言内容和示例 XML 和 HTML 内容。文档映射中的 CDATA 节使用以下语法。
<![CDATA[An in-depth look at creating applications with XML, using <, >,]]>
在 XML 分析器遇到第一个 <![CDATA[ 时,会将后面的内容报告为字符,而不尝试将其解释为元素或实体标记。字符引用在 CDATA 节中无效。分析器在遇到结束的 ]]> 时,将停止报告并返回正常分析。
CDATA 节中的内容必须在 XML 内容允许的字符范围内;控制字符和兼容性字符不能通过这种方式转义。此外,CDATA 节中不能出现 ]]> 序列,因为此序列代表节的结尾。这意味着 CDATA 节无法嵌套。该序列还会出现在某些脚本中。在脚本中,通常可以用] ]> 替代 ]]>。
10、属性
过属性可以使用名值对添加与元素有关的信息。属性经常用于为不属于元素内容的元素定义属性,尽管在某些情况下(例如 HTML img 元素),元素内容由属性值确定。
属性可以出现在开始标记中,也可以出现在空标记中,但是不能出现在结束标记中。语法类似如下所示:
<elementName att1Name="att1Value" att2Name="att2Value"...>
或
<elementName att1Name="att1Value" att2Name="att2Value".../>
属性必须有名称和值。不允许没有值的属性名。元素不能包含两个同名的属性。因为 XML 认为属性在元素中出现的顺序并不重要,所以,XML 分析器可能会保留该顺序。
与元素名一样,属性名区分大小写,并且必须以字母或下划线开头。名称的其他部分可以包含字母、数字、连字符、下划线和句点。
属性值必须遵循与正常文本内容相同的规则,并增加了一些限制。属性值只能包含文本,不能包含元素标记。属性值中允许包含实体引用和字符引用,但是不允许包含 CDATA 节。
最后,引号可能必须转义。XML 规范允许使用单引号或双引号指示属性,尽管属性值两侧所使用的引号类型必须相同。但是,属性值两侧必须使用引号。XML 分析器将简单地拒绝属性值两侧未使用引号的文档,并报告错误。
如果使用单引号指示属性值,必须使用 ' 实体引用显示属性值中的单引号。
<myElement contraction='isn't' />
11、空白
万维网联合会 (W3C) XML 规范使不同的行尾约定标准化为一个约定,但是保留所有其他空白(属性值中除外)。XML 还提供一组工具,文档可以使用这些工具来通知应用程序是否必须保留空白。
空白和 XML 声明
根据当前的 XML 1.0 标准,在 XML 声明之前不允许包含空白。
<?xml version="1.0"?>
<BOOK>
<BOOKNAME>XML</BOOKNAME>
</BOOK>
如果在 XML 声明之前出现空白,将作为处理指令对待。分析器可能无法使用该信息
元素内容中的空白
需要 XML 分析器报告文档的元素内容中出现的所有空白。
属性中的空白
行尾的处理
XML 处理器将字符序列回车换行符 (CRLF) 作为单个 CR 或 LF 字符一样对待。所有此类字符序列均报告为单个 LF 字符。应用程序可以使用适合的行尾约定保存文档。
尽管 XML 处理器保留元素内容中的所有空白,但是通常会将属性值中的空白标准化。制表符、回车符和空格均报告为单个空格。在某些类型的属性中,将删除值主体之前或之后的空白,将值中的空白减小为单个空格。(如果有 DTD,将在所有非 CDATA 类型的属性上进行此删除。)
二、DTD 语句
DTD 是一套关于标记符的语法规则。它是XML1.0版规格得一部分,是XML文件的验证机制,属于XML文件组成的一部分。
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。
XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互
ELEMENT:ELEMENT 语句用于声明 DTD 所定义的文档类型中使用的每个元素。先按名称声明元素,然后指定该元素允许包含的内容。
ATTLIST:声明用于列出并声明可以属于某个元素的每个属性。先指定将应用属性列表的元素的名称。然后按名称列出每个属性,指示属性是不是必选属性,并指定允许作为值的字符数据。
ENTITY:语句用于在 DTD 中定义实体,供与 DTD 关联的 XML 文档以及 DTD 本身使用。ENTITY 提供缩写的条目,以便放入 XML 文档。缩写的名称是您为 name 参数提供的内容。在重复可以存储在独立文件中的信息或大块文本时,ENTITY 非常有用。在 XML 文档中,缩写的名称后接 ; (&abbName;)。
NOTATION:NOTATION 语句用于定义批注。批注使 XML 文档可以将通知信息传递给外部应用程序。
三、XSD
XML结构定义 ( XML Schemas Definition )
XML Schema 是DTD的替代品。XML Schema语言也就是XSD。
XML Schema描述了XML文档的结构。可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XML Schema指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。XML Schema本身是一个XML文档,它符合XML语法结构。可以用通用的XML解析器解析它。
一个XML Schema会定义:文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值。
XSD是DTD替代者的原因,一是据将来的条件可扩展,二是比DTD丰富和有用,三是用XML书写,四是支持数据类型,五是支持命名空间。
XSD文件的后缀名为.xsd。
XML Schema的优点:
1) XML Schema基于XML,没有专门的语法
2) XML可以象其他XML文件一样解析和处理
3) XML Schema支持一系列的数据类型(int、float、Boolean、date等)
4) XML Schema提供可扩充的数据模型。
5) XML Schema支持综合命名空间
6) XML Schema支持属性组。
XML架构元素
XML 架构元素按功能分组:顶级元素、粒子、多个 XML 文档和命名空间、标识约束、属性、命名属性、复杂类型定义和简单类型定义。
四、XSLT
XSLT是扩展样式表转换语言(Extensible Stylesheet Language Transformations)的简称。XSLT是把XML文档转化为另一XML文档的XML转换语言。 即将源文档的所有数据或者部分数据 (利用XPath进行选择)生成另外的XML文档或者其他可直接显示或打印的文件格式(例如 HTML文件, RTF文件或者TeX文件)。在这个转换过程中具体有以下涉及:
加上一些诸如HTML文档中的固定标签
移动文本
对文本排序
被转换的源XML文档具有树状结构。XSLT语言是声明性语言,即XSLT程序本身只是包含了一些转换规则的文档。而这些规则可以被递归地应用到转换过程中。XSLT本身也是一份XML文档,所以它也必须遵守严格的XML规范。
XSLT示例 下载
1、XSLT元素
xsl:apply-imports 调用重写模板规则。 <xsl:apply-imports /> <xsl:import href="str.xsl"/>
xsl:apply-templates 指示 XSLT 处理器根据每个选定节点的类型和上下文找到适合应用的模板。<xsl:apply-templates select = Expression mode = QName></xsl:apply-templates>
xsl:attribute 创建一个属性节点并将其附加到输出元素上。
xsl:attribute-set 定义命名的属性集。<xsl:attribute-set name = QName use-attribute-sets = QNames ></xsl:attribute-set>
xsl:call-template 按名称调用模板。<xsl:call-template name = QName> </xsl:call-template>
xsl:choose 提供多个与 <xsl:otherwise> 元素和 <xsl:when> 元素有关的条件测试。
xsl:comment 在输出中生成注释。
xsl:copy 将当前节点从源复制到输出。<xsl:copy use-attribute-sets = QNames> </xsl:copy>
xsl:copy-of 将子树和结果树片断插入结果树。
xsl:decimal-format 声明一个小数格式,用于控制 format-number 函数所使用的格式模式的解释。
xsl:element 在输出中创建指定名称的元素。<xsl:element name = "element-name" namespace = "uri-reference" use-attribute-sets = QName></xsl:element>
xsl:fallback 调用可以为遇到的新元素的行为提供适合的替代行为的模板内容。
xsl:for-each 重复应用模板,对节点集中的每个节点应用模板。<xsl:for-each select = Expression></xsl:for-each>
xsl:if 允许简单条件模板片断。<xsl:if test = boolean-expression></xsl:if>
xsl:import 导入另一个 XSLT 文件。
xsl:include 包含另一个 XSLT 文件。
xsl:key 声明一个命名的键,用于 XML 路径语言 (XPath) 表达式中的 key() 函数。<xsl:key> 元素声明一个命名的键 — 即为 XML 文档中指定的元素分配的名值对。该键与 XPath 表达式中的 key() 函数组合使用,帮助您有效地在复杂 XML 文档中访问分配的元素。<xsl:key name = QName match = Pattern use = Expression></xsl:key>
xsl:message 将文本消息发送到消息缓冲区或消息对话框。
xsl:namespace-alias 使用其他前缀替换与给定命名空间关联的前缀。
xsl:number 将格式化的数字插入结果树。<xsl:number level = "single" | "multiple" | "any" count = Pattern from = Pattern value = number-expression format = { string } lang = { nmtoken } letter-value = { "alphabetic" | "traditional" } grouping-separator = { char } grouping-size = { number } />
level 指定应考虑的源树级别;值为 "single"、"multiple" 和 "any"。默认值为 "single"。
count 指定所选级别上应计算的节点的模式。如果未指定 count 属性,默认情况下将采用与当前节点的类型相同的任何节点匹配的模式,如果当前节点具有扩展名称,则为与当前节点的扩展名称相同的任何节点匹配的模式。
from 指定计数起始位置的模式。
value 指定要转换为数字并输出到结果树的表达式。如果未指定 value 属性,<xsl:number> 元素将根据当前节点在源树中的位置插入一个数字。
format 指定列表中的每个数字要使用的格式的标记序列。如果没有格式标记,将使用默认值 1,生成序列 1 2 ... 10 11 12...。第一个数字之后的每个数字通过分隔符标记与前一个数字分隔,分隔符标记位于用于格式化该数字的格式标记的前面。如果没有分隔符标记,将使用句点字符(“.”)。
格式标记 生成的序列
1 1 2 3 4 5 ... 10 11 12 ...
01 01 02 03 ... 19 10 11 ... 99 100 101...
A A B C ...Z AA AB AC...
i i ii iii iv v vi vii viii ix x...
I I II III IV V VI VII VIII IX X...
xsl:otherwise 提供多个与 <xsl:choose> 元素和 <xsl:when> 元素有关的条件测试。<xsl:otherwise></xsl:otherwise>
xsl:output 指定在序列化结果树时要使用的选项。<xsl:output method = "xml" | "html" | "text" | QName version = nmtoken encoding = string omit-xml-declaration = "yes" | "no" standalone = "yes" | "no" doctype-public = string doctype-system = string cdata-section-elements = QNames indent = "yes" | "no" media-type = string />
method 标识用于输出结果树的总体方法。如果没有前缀,则标识此文档中指定的方法,必须是“xml”、“html”、“text”或不是 NCName 的限定名 之一)。如果有前缀,则展开并标识输出方法。
method 属性的默认值的选择如下所示。如果下列任何条件为真,默认的输出方法为“html”:
结果树的根节点包含元素子级。
结果树中根节点的第一个元素子级(即文档元素)的扩展名称包含本地部分“html”(任意大小写组合)和空命名空间 URI。
结果树中根节点的第一个元素子级之前的任何文本节点只包含空白字符。
否则,默认的输出方法为“xml”。如果没有 <xsl:output> 元素或没有 <xsl:output> 元素指定了 method 属性的值,应使用默认的输出方法。
version 对于“xml”输出方法,指定版本 1.0;此版本在输出 XML 声明中显示为 <?xml version="1.0"?>。
encoding 指定分析器在将字符序列编码为字节序列时应使用的首选字符编码。该属性的值不区分大小写;只能包含可打印的 ASCII 字符并作为注册的字符集,或以 x- 开头。
omit-xml-declaration 指定 XSLT 处理器是否应输出 XML 声明;该值必须为 yes 或 no。
standalone 指定 XSLT 处理器是否应输出独立文档声明;该值必须为 yes 或 no。
doctype-public 指定 DTD 中要使用的公共标识符。
doctype-system 指定 DTD 中要使用的系统标识符。
cdata-section-elements 指定文本节点子级应使用 CDATA 节输出的元素的限定名 列表。
indent 指定在输出结果树时是否要增加空白;该值必须为 yes 或 no。
media-type 指定通过输出结果树生成的数据的媒体类型(MIME 内容类型)。
xsl:param 声明一个命名的参数,在 <xsl:stylesheet> 元素或 <xsl:template> 元素中使用。允许指定默认值。<xsl:param name = QName select = Expression></xsl:param>
xsl:preserve-space 在文档中保留空白。
xsl:processing-instruction 在输出中生成处理指令。
msxsl:script* 为脚本扩展定义全局变量和函数。
xsl:sort 指定 <xsl:for-each> 或 <xsl:apply-templates> 所选的节点列表的排序条件。 <xsl:sort select = string-expression lang = { nmtoken } data-type = { "text" | "number" | QName } order = { "ascending" | "descending" } case-order = { "upper-first" | "lower-first" } />
select 节点的排序关键字。将指定节点作为当前节点并将未排序进行处理的完整节点列表作为当前节点列表计算的表达式。生成的对象转换为字符串,作为该节点的排序关键字。select 属性的默认值为 "."。这样,当前节点的字符串值将作为排序关键字使用。
lang 用于确定排序顺序的语言字母表。如果未指定 lang 值,将根据系统环境确定语言。
data-type 字符串的数据类型。下表列出了 data-type 属性允许的值。
text 指定排序关键字应按照字母顺序排序。
number 指定排序关键字应转换为数字,然后根据数值进行排序。排序关键字转换为数字。
QName 展开为扩展名称。扩展名称标识数据类型。如果未指定数据类型,将使用表达式的类型作为默认类型。
order 字符串的排序顺序。默认值为 "ascending"。
case-order 按大写字母对字符串排序的顺序。默认值为 "upper-first",即先按大写字母对字符串排序。
xsl:strip-space 从文档中删除空白。
xsl:stylesheet 指定 XSLT 文件的文档元素。文档元素包含所有其他 XSLT 元素。
xsl:template 定义一个可再次使用的模板,用于为特定类型和上下文的节点生成所需的输出。<xsl:template name= Qname match = Pattern priority = number mode = QName></xsl:template>
name 要展开的限定名。如果有前缀,前缀将使用出现名称的属性上的有效命名空间声明展开为统一资源标识符 (URI) 引用。扩展名称由名称的本地部分以及可能的空 URI 引用组成,作为模板的名称。没有前缀的名称不使用默认的命名空间。如果 <xsl:template> 元素有 name 属性,可以(但是不需要)同时有 match 属性。
match 标识应用规则的源节点的模式。match 属性是必选项,除非 <xsl:template> 元素有 name 属性。<xsl:template> 元素的内容是在应用模板规则时实例化的模板。
priority 模板的优先级编号。不考虑所有优先级低于最高优先级的匹配模板规则。此属性的值必须是 0–9 的实数,正数负数都可以,将包含可选的前导减号 (-) 的生成编号匹配。默认的优先级如下所示进行计算:
如果模式包含通过 | 分隔的多个替换项,处理时相当于一组模板规则,每个替换项代表一个模板规则。
如果模式的格式为 Qname 前面有一个子级或属性轴指定符,或处理指令文本前面有一个子级或属性轴指定符,则优先级为 0。
如果模式是名称前面有一个子级或属性轴指定符,则优先级为 -0.25。
否则,如果模式只是节点测试前面有一个子级或属性轴指定符,则优先级为 -0.5。
否则,优先级为 0.5。
因此,最常见的模式(测试是否有特定类型和特定扩展名称的节点的模式)的优先级为 0。明确性差一些的模式(测试是否有特定类型和具有特定命名空间 URI 的扩展名称的节点的模式)的优先级为 -0.25。明确性更差一些的模式(只测试是否有特定类型的节点的模式)的优先级为 -0.5。比最常见模式明确性更强的模式的优先级为 0.5。
mode 模式值。此值允许多次处理某个元素,每次产生不同的结果。如果 <xsl:template> 没有 match 属性,就不得有 mode 属性。如果 <xsl:apply-templates> 元素有 mode 属性,则只应用于 mode 属性值相同的 <xsl:template> 元素中的模板规则;如果 <xsl:apply-templates> 元素没有 mode 属性,则只应用于没有 mode 属性的 <xsl:template> 元素中的模板规则。
xsl:text 在输出中生成文本。
xsl:transform 执行与 <xsl:stylesheet> 相同的功能。
xsl:value-of 将选定节点的值作为文本插入。
xsl:variable 指定表达式中绑定的值。
xsl:when 提供多个与 <xsl:choose> 元素和 <xsl:otherwise> 元素有关的条件测试。
xsl:with-param 将参数传递给模板。
2、XSLT函数
current 返回当前节点作为唯一成员的节点集。
document 提供从 XSLT 样式表中检索由输入流提供的初始数据以外的其他 XML 资源的方法。
element-available 只有扩展名称是指令的名称时,才返回 True。
format-number 使用第二个参数指定的格式模式字符串将第一个参数转换为字符串。
function-available 如果函数在函数库中可用,则返回 True。
generate-id 返回唯一标识 node-set 参数中按文档顺序的第一个节点的字符串。
key 检索以前使用 <xsl:key> 语句标记的元素。
node-set 将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。
system-property 返回的对象表示通过名称标识的系统属性的值。
unparsed-entity-uri 返回源文档的文档类型定义 (DTD) 中的未分析实体的声明。
3、XSLT语法
限定名
限定名 (QName) 由前缀和本地部分组成。前缀为限定名提供命名空间前缀部分,必须与命名空间统一资源标识符 (URI) 关联。
NaN 值
术语 NaN 代表“非数字”,意味着符号实体的值不是浮点格式。有两种 NaN。
Quiet
代表未知或未初始化的值。
Signaling
代表符号值或对于该格式太大或太精确的值。如果尝试对 Signaling NaN 进行操作,Signaling NaN 将产生无效操作异常。
表达式
XSL 转换 (XSLT) 中的表达式的用途如下。
选择要处理的节点。
指定通过不同方式处理节点的条件。
生成要插入结果树的文本。
表达式作为 XSLT 定义的元素的特定属性值出现,出现在属性值模板中的大括号内。
表达式根据上下文进行计算。在 XSLT 中,最外面的表达式(即不属于其他表达式的表达式)如下所述获取上下文。
上下文节点来自当前节点。
上下文位置来自当前节点在当前节点列表中的位置;第一个位置是 1。
上下文大小来自当前节点列表的大小。
变量绑定的范围是具有出现该表达式的属性的元素。
命名空间声明集的范围是具有出现该表达式的属性的元素。
函数库包括 XPath 函数中介绍的函数以及 addObject 方法或 msxsl:script 元素等绑定机制定义的任何函数。调用没有相应绑定的函数属于错误。
模式
模式是一种表达式,根据节点的一组条件返回一组节点。符合条件的节点与模式匹配。模式语法是表达式语法的一个子集。特别是,符合特定限制的位置路径可以作为模式使用。如果表达式同时也是模式,将总是计算为节点集类型的对象。如果某个节点是将模式作为表达式(与某些可能的上下文有关)的计算结果的成员,则表示该节点符合模式;这里可能的上下文是其上下文节点属于匹配节点或其上级之一的上下文。
下表列出了模式的示例。
模式 匹配
Para 任何 para 元素
* 任何元素
chapter|appendix 任何 chapter 元素和任何 appendix 元素
olist/item 任何具有 olist 父级的 item 元素
appendix//para 任何具有 appendix 祖先元素的 para 元素
/ 根节点
text() 任何文本节点
processing-instruction()任何处理指令
node() 除了属性节点和根节点以外的任何节点
id("W11") 具有唯一 ID W11 的元素
para[1] 任何属于父级的第一个 para 子元素的 para 元素
*[position()=1 and self::para] 任何属于父级的第一个子元素的 para 元素
para[last()=1] 任何属于父级的唯一一个 para 子元素的 para 元素
items/item[position()>1] 任何具有 items 父级但不是父级的第一个 item 子元素的 item 元素
item[position() mod 2 = 1] 任何属于父级的奇数个 item 子元素的 item 元素
div[@class="appendix"]//p 任何 div 祖先元素具有值为 appendix 的 class 属性的 p 元素
@class 任何 class 属性(不是任何具有 class 属性的元素)
@* 任何属性
五、XPath语法
1、XPath表达式的上下文
当前上下文 :以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。例如,以下表达式引用当前上下文中的所有 <author> 元素:./author。此表达式等效于以下表达式:author
文档根:以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。例如,以下表达式引用此文档根的 <bookstore> 元素:/bookstore。
根元素:使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。例如,以下表达式查找文档的根元素:/*
递归下降 :使用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。如果此运算符出现在模式的开头,上下文相对于文档的根。例如,以下表达式引用当前文档中任意位置的所有 <author> 元素://author。.// 前缀指示上下文从层次结构中当前上下文所指示的级别开始。
特定元素:以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。例如,以下表达式引用当前上下文节点中 <images> 元素内的 <background.jpg> 元素:images/background.jpg;以下表达式引用当前上下文节点中 <bookstore> 元素内的 <book> 元素的集合:bookstore/book;以下表达式引用当前上下文节点中的所有 <first.name> 元素:first.name
DOM 中的上下文
在 Microsoft XML DOM 中使用 XPath 表达式时,上下文是调用其 selectNodes 方法或 selectSingleNode 方法的 Node 对象。
如果直接从 DOM 使用 XPath,应从特定节点定义上下文。
XSLT 中的上下文
如果直接从 XSLT 使用 XPath,应通过当前节点定义上下文。
2、运算符和特殊字符
/ 子运算符;选择左侧集合的直接子级。此路径运算符出现在模式开头时,表示应从根节点选择该子级。
// 递归下降;在任意深度搜索指定元素。此路径运算符出现在模式开头时,表示应从根节点递归下降。
. 指示当前上下文。
.. 当前上下文节点的父级。
* 通配符;选择所有元素,与元素名无关。
@ 属性;属性名的前缀。
@* 属性通配符;选择所有属性,与名称无关。
: 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。
( ) 为运算分组,明确设置优先级。
[ ] 应用筛选模式。
[ ] 下标运算符;用于在集合中编制索引。
+ 执行加法。
- 执行减法。
div 根据 IEEE 754 执行浮点除法。
* 执行乘法。
mod 从截断除法返回余数。
3、XPATH集合
XPath 查询返回的集合在定义的范围内保留文档顺序、层次结构和标识。也就是说,按照文档顺序返回元素集合,没有重复的元素。因为根据定义,属性不排序,所以,为特定元素返回的属性不进行明确地排序。具有特定标记名的所有元素的集合使用标记名本身表示。限定方法可以通过使用句点和正斜杠 (./) 表明元素是从当前上下文中选择,但是默认情况下将使用当前上下文,不必明确说明。
为集合编制索引
使用 XPath 表达式可以很容易在节点集中查询特定的节点。只需为索引序号加上方括号。序号从 1 开始(第一个元素是编号 1)。方括号字符 ([]) 的优先级高于斜杠字符(/ 和 //)。
author[1] 第一个 <author> 元素。
author[first-name][3] 具有 <first-name> 子元素的第三个 <author> 元素
x/y[1] 每个 <x> 中的第一个 <y>。
(x/y)[1] <x> 元素中整个 <y> 元素集的第一个 <y>。
x[1]/y[1] 第一个 <x> 中的第一个 <y>。
查找集合中的最后一个元素
last() 函数对集合中的最后一个元素返回 True。注意,last 相对于父节点。
book[last()] 最后一个 <book> 元素。
book/author[last()] 每个 <book> 元素中的最后一个 <author> 元素
(book/author)[last()] <book> 元素中整个 <author> 元素集的最后一个 <author> 元素
分组
为了清楚起见,或正常的优先级不足以表达某个运算,可以使用括号为集合运算符分组。分组运算符可以在任何筛选表达式(谓词)中使用,例如 author[(degree or award)and publication]。也可以在顶级步长表达式中使用,例如 (book|magazine) 或 (author/degree | book/award)。不能应用于低级步长表达式。例如,author/(degree | award)无效。
4、筛选器和筛选模式
通过将筛选子句 [pattern] 添加到集合中,可以对任何集合应用约束和分支。筛选器类似于 SQL WHERE 子句。筛选器中包含的模式称为“筛选模式”。筛选模式计算为布尔值,对集合中的每个元素进行测试。集合中所有未通过筛选模式测试的元素将从结果集合中省略。
为了方便起见,如果集合在筛选器内,若集合包含任何成员,则生成布尔值 TRUE,若集合为空,则生成 FALSE。author/degree 之类的表达式意味着,如果存在包含名为 <degree> 的子元素的 <author> 元素,集合到布尔值的转换函数将计算为 TRUE。
注意,在表达式的给定级别可以出现任意数目的筛选器。不允许使用空筛选器。
5、布尔、比较和集表达式
运算符 说明
and 逻辑与
or 逻辑或
not() 非
= 相等
!= 不相等
< * 小于
<= * 小于或等于
> * 大于
<= * 大于或等于
| 集运算;返回两个节点集的联合
6、比较
要在 XPath 中比较两个对象,可以使用 = 测试是否相等,也可以使用 != 测试是否不相等。
对于比较运算,必须正好提供两个操作数。比较的过程是计算每个操作数,然后根据需要将操作数转换为相同的类型。按照下面的“比较的优先级顺序”中所述的过程完成比较。
所有元素和属性都是字符串,但是在进行数字比较时会自动被强制转换为整数值。在比较运算期间,文本数值会被强制转换为 long 或 double 类型,如下表所示。
有关 < 和其他二进制比较运算符的信息,请参见下面的“二进制比较运算符”。
文本类型 比较 示例
String text(lvalue) op text(rvalue) a < GGG
Integer (long) lvalue op (long) rvalue a < 3
Real (double) lvalue op (double) rvalue a < 3.1
单引号或双引号可以作为表达式中字符串的分隔符。这样更容易从脚本语言内部构造和传递模式。
表达式 引用
author[last-name = "Bob"] 至少包含一个值为 Bob 的 <last-name> 元素的所有 <author> 元素。
author[last-name[1] = "Bob"] 第一个 <last-name> 子元素的值为 Bob 的所有 <author> 元素。
author/degree[@from != "Harvard"] 包含 from 属性不等于 "Harvard" 的 <degree> 元素的所有 <author> 元素。
author[last-name = /editor/last-name] 包含与根元素下 <editor> 元素中的 <last-name> 元素相同的 <last-name> 元素的所有 <author> 元素。
author[. = "Matthew Bob"] 所有字符串值为 Matthew Bob 的 <author> 元素。
比较的优先级顺序
与数据类型有关的比较遵循下列优先级顺序。
如果至少有一个操作数为布尔值,每个操作数必须先转换为布尔值。
否则,如果至少有一个操作数为数字,每个操作数必须先转换为数字。
否则,如果至少有一个操作数为日期,每个操作数必须先转换为日期。
否则,两个操作数都先转换为字符串。
二进制比较运算符
可以通过一组二进制比较运算符比较数字和字符串,然后返回布尔值结果。<、<=、> 和 >= 运算符分别表示小于、小于等于、大于和大于等于。单引号或双引号可以作为表达式中字符串的分隔符。这样更容易从脚本语言内部构造和传递模式。
7、集运算
XML 路径语言 (XPath) 支持集运算 |。
Union (|) 运算符
|(即 union)运算符返回两个操作数的联合,操作数必须是节点集。例如,//author | //publisher 返回的节点集结合了所有 //author 节点和所有 //publisher 节点。多个 union 运算符可以链接在一起,组合多个节点集。例如,//author | //publisher | //editor | //book-seller 返回的节点集包含所有 //author、//publisher、//editor 和 //book-seller elements。union 运算符保留文档顺序,并且不返回重复项。
表达式 引用
first-name | last-name 包含当前上下文中的 <first-name> 和 <last-name> 元素的节点集。
(bookstore/book | bookstore/magazine) 包含 <bookstore> 元素中的 <book> 或 <magazine> 元素的节点集。
book | book/author 包含 <book> 元素中的所有 <book> 元素和所有 <author> 元素的节点集。
(book | magazine)/price 包含 <book> 或 <magazine> 元素的所有 <price> 元素的节点集。
8、位置路径
位置路径是一种 XPath 表达式,用于选择相对于上下文节点的一组节点。计算位置路径表达式所得到的节点集,将包含位置路径指定的节点。位置路径可以以递归方式包含表达式,用来筛选节点集。
在语法上,位置路径由一个或多个定位步骤组成,每个步骤通过正斜杠 (/) 分隔:
locationstep/locationstep/locationstep
每个定位步骤依次选择相对于上下文节点(即上一个定位步骤所选择的节点)的一组节点。通过这种方式表示的位置路径为相对位置路径。绝对位置路径从根元素开始:
/locationstep/locationstep/locationstep
在位置路径中,定位步骤从左到右进行计算。最左侧的定位步骤选择一组相对于上下文节点的节点。然后,这些节点成为上下文节点,用于处理下一个定位步骤。这种步骤的处理和上下文节点的更新自行重复,直到所有定位步骤处理完毕。
axis::node-test[predicate]
在此语法中,axis 指定定位步骤选择的节点与上下文节点的关系;node-test 指定定位步骤选择的节点的节点类型和扩展名称;predicate 是一个筛选表达式,进一步精确定位步骤中的节点选择。谓词是可选的。在此例中,定位步骤仅包含 axis:: 和 node-test。下表提供了一些示例。
child::para[last()] 选择上下文节点的最后一个 <para> 元素。
parent::para 选择作为上下文节点父级的 <para> 元素。
child::text() 选择上下文节点的所有文本节点子级。
child::div/child::para 选择作为上下文节点子级的 <div> 元素的 <para> 子元素。
在缩写的位置路径中,轴指定符 axis:: 在定位步骤中未明确表达,而是通过一组快捷方式暗示。下表提供了一些示例。
para 选择上下文节点的 <para> 元素
../para 选择作为上下文节点父级的 <para> 元素。
text() 选择上下文节点的所有文本节点子级。
A 定位步骤
定位步骤相对于上下文节点选择一组节点(节点集)。
定位步骤分为三个部分:可选轴、节点测试和可选谓词。定位步骤的语法是轴名后接双冒号,然后接节点测试,最后是零个或多个谓词(每个谓词都放在方括号中)。此语法的最基本形式如下所示:
axis::nodetest[predicate]
axis:指定上下文节点与定位步骤所选的节点之间的树型关系。也就是说,轴指示定位步骤从上下文节点开始的常规方向。在定位步骤中,轴是可选项。如果省略,轴默认为 child::。另外,有几个轴具有快捷方式;例如“and”符 (@) 是属性轴的快捷方式。
nodetest:指定定位步骤最初选择的节点的节点类型或扩展名称。基本上,节点测试指示将指定轴上的所有节点中哪些节点视为定位步骤的候选(即潜在)匹配项。
predicate:使用 XPath 表达式(要满足的条件)进一步精选定位步骤所选的节点集。谓词是一个过滤器,通过指定选择标准来进一步精选候选节点列表。谓词是可选项。如果没有谓词,定位步骤中就没有方括号 ([ and ])。
根据轴和节点测试之间的关系生成初始节点集,然后依次通过每个谓词筛选该初始节点集,从而确定定位步骤所选的节点集。
初始节点集由满足下列两个条件的节点组成:
节点与轴指定的上下文节点有关系。
节点具有节点测试指定的节点类型和扩展名称。
XPath 使用定位步骤中的第一个谓词筛选初始节点集,以生成新的节点集。然后,XPath 使用第二个谓词筛选第一个谓词生成的节点集。此筛选过程重复进行,直到 XPath 计算完所有谓词。应用了所有谓词之后生成的节点集就是定位步骤所选的节点集。
因为轴影响每个谓词中的表达式的计算,谓词的语义相对指定轴定义。
B 轴
轴 说明
ancestor:: 上下文节点的上级。上下文节点的上级由上下文节点的父级以及父级的父级等组成;因此,ancestor:: 轴总是包括根节点,除非上下文节点就是根节点。
ancestor-or-self:: 上下文节点及其上级。
ancestor-or-self:: 轴总是包括根节点。
attribute:: 上下文节点的属性。除非上下文节点为元素,否则,此轴将是空的。
child:: 上下文节点的子级。子级是树中上下文节点以下紧邻的任何节点。但是,属性节点或命名空间节点均不属于上下文节点的子级。
descendant:: 上下文节点的子代。子代是子级或子级的子级,等等;因此,descendant:: 轴永远不会包含属性节点或命名空间节点。
descendant-or-self:: 上下文节点及其子代。
following:: 树中在上下文节点之后的所有节点,除了子代、属性节点和命名空间节点之外。
following-sibling:: 上下文节点的所有后续同辈。
following-sibling:: 轴只标识出现在树中上下文节点之后的父节点子级。该轴不包括所有出现在上下文节点之前的其他子级。如果上下文节点是属性节点或命名空间节点,following-sibling:: 轴是空的。
namespace:: 上下文节点的命名空间节点。每个处于上下文节点范围内的命名空间都有一个命名空间节点。除非上下文节点为元素,否则,此轴将是空的。
parent:: 上下文节点的父级(如果有)。父级是树中上下文节点以上紧邻的节点。
preceding:: 树中在上下文节点之前的所有节点,除了上级、属性节点和命名空间节点之外。有一种方法是,将 preceding 轴看作是内容全部出现在上下文节点开始之前的所有节点。
preceding-sibling:: 上下文节点的所有前接同辈。
preceding-sibling:: 轴只标识出现在树中上下文节点之前的父节点子级。该轴不包括所有出现在上下文节点之后的其他子级。如果上下文节点是属性节点或命名空间节点,preceding-sibling:: 轴是空的。
self:: 只是上下文节点本身。
C 节点测试
1、名称测试 名称测试中指定的名称可能属于以下三种类型之一:星号 (*)、QName 或表达式 NCName:*。下表显示的示例说明每种类型的名称如何与指定的轴配合使用,以找到特定的节点集。
名称 返回 示例
*(星号) 对于任何主要节点类型的节点,返回 True。 ancestor::* 选择上下文节点的所有上级。attribute::* 选择上下文节点的所有属性。namespace::* 选择上下文节点的所有名称属性。
QName 对于任何扩展名称等于 QName 指定的扩展名称的主要节点类型节点,返回 True。 child::para 选择所有属于上下文节点子级的 <para> 元素节点。如果上下文节点没有 <para> 子级,则选择一个空节点集。
NCName:* 对于任何扩展名称包含 NCName 展开到的命名空间 URI 的主要节点类型节点(与本地名称无关),返回 True。
2、节点类型测试
要选择除元素节点以外(或包括元素节点)的节点类型,请使用节点类型测试。使用节点类型测试的作用是重写给定轴的主要节点类型。例如,descendant::text() 找到上下文节点以下的所有文本节点,即使下降轴的主要节点类型是元素。
有四种节点类型测试,如下表中所示。
comment() 对注释节点返回 True。 following::comment() 选择所有出现在上下文节点之后的注释节点。
node() 对任何类型的节点返回 True。 preceding::node() 选择所有出现在上下文节点之前的节点。
processing-instruction() 对处理指令节点返回 True。 self::processing instruction() 选择上下文节点中的所有处理指令节点。
text() 对文本节点返回 True。 child::text() 选择属于上下文节点子级的文本节点。
节点类型测试结尾的括号 () 是必不可少的。如果源文档包含名称为注释、文本、处理指令或节点的节点,结尾的括号可以避免可能会产生的任何问题。如果 XPath 应用程序遇到双括号,可以确定属于节点类型测试,而不是对具有相应名称的节点的名称测试。同样,节点类型测试不是 XPath 函数,后者的引用也包含括号、空字符串或其他字符串。
3、指定目标的处理指令测试
节点测试可以是指定目标的处理指令。此类节点测试的语法如下所示: processing-instruction("target")
通过指定目标,处理指令测试找到所有与该目标匹配的处理指令节点。例如,以下节点测试找到文档中所有指定 XSLT 文件的处理指令节点。/child::processing-instruction("xml-stylesheet")
D 谓词
谓词是一个 XPath 表达式,用于针对某个轴筛选节点集,并生成一个新的节点集。此筛选过程包括按顺序针对节点集中的每个节点计算该谓词。每次针对节点计算该谓词时:
上下文节点是当前计算的节点。
上下文大小节点集中正在计算的节点数。
上下文位置是上下文节点在节点集中的位置。
最后一个上下文(即节点集中上下文节点的上下文)相对于定位步骤中指定的轴浏览文档树的方向。通常,轴会按照正方向或反方向浏览树:
正轴是包含上下文节点或上下文节点之后的节点的轴。child::、descendant::、descendant-or-self::、following:: 和 following-sibling:: 轴是正轴。这些正轴按文档顺序为节点集中的节点编号,从第一个位置 1 开始。
反轴是包含上下文节点或上下文节点之前的节点的轴。ancestor::、ancestor-or-self::、preceding:: 和 preceding-sibling:: 轴是反轴。这些反轴按文档顺序相反的顺序为节点集中的节点编号,从第一个位置 1 开始。
对于其他轴,self:: 和 parent:: 轴返回单个节点。因此,指定正轴或反轴对这两个轴没有意义。attribute:: 和 namespaces:: 轴没有定义顺序;所以,也没有正轴和反轴。
谓词表达式计算为数值或布尔值。如果谓词计算为数字,XPath 将该数字与上下文节点的上下文位置进行比较。如果数字和位置相同(即上下文节点处于树中相应的位置),谓词将计算为 true,上下文节点将包含在新的节点集中。否则,上下文节点将排除在新节点集之外。
如果谓词没有计算为数字,XPath 将使用 boolean 函数将结果转换为布尔值。例如,谓词 [genre='Computer'] 计算为一个节点集。如果上下文节点包含内容为 Computer 的 <genre> 子元素,此谓词将计算为 true,上下文节点将包含在新的节点集中。否则,上下文节点将排除在新节点集之外
数字谓词 [x] 等效于布尔谓词 [position()=x]。
E 位置路径示例
路径 说明
child::node() 选择上下文节点的所有子级,无论属于哪种节点类型。
attribute::name 选择上下文节点的 name 属性。
attribute::* 选择上下文节点的所有属性。
descendant::para 选择上下文节点的 <para> 元素子代。
ancestor::div 选择上下文节点的所有 <div> 上级。
ancestor-or-self::div 选择上下文节点的 <div> 上级,如果上下文节点是 <div> 元素,还将选择该上下文节点。
descendant-or-self::para 选择上下文节点的 <para> 元素子代,如果上下文节点是 <para> 元素,还将选择该上下文节点。
self::para 如果上下文节点是 <para> 元素,则选择该上下文节点;否则,不选择任何内容。
child::chapter/descendant::para 选择上下文节点的 <chapter> 元素子级的 <para> 元素子代。
child::*/child::para 选择上下文节点的所有 <para> 孙级。
/ 选择文档根(总是文档元素的父级)。
/descendant::para 选择与上下文节点相同的文档中的所有 <para> 元素。
/descendant::olist/child::item 选择所有具有 <olist> 父级以及与上下文节点处于同一文档的 <item> 元素。
child::para[position()=1] 选择上下文节点的第一个 <para> 子级。
child::para[position()=last()] 选择上下文节点的最后一个 <para> 子级。
child::para[position()=last()-1] 选择上下文节点的倒数第二个 <para> 子级。
child::para[position()>1] 选择上下文节点的所有 <para> 子级,上下文节点的第一个 <para> 子级除外。
/descendant::figure[position()=42] 选择文档中的第 42 个 <figure> 元素。
/child::doc/child::chapter[position()=5]/child::section[position()=2] 选择 <doc> 文档元素的第 5 个 <chapter> 元素中包含的第二个 <section> 元素。
child::para[attribute::type="warning"] 选择上下文节点中所有 type 属性值为 "warning" 的 <para> 子级。
child::para[attribute::type="warning"][position()=5] 选择上下文节点中 type 属性值为 "warning". 的第 5 个 <para> 子级。
child::para[position()=5][attribute::type="warning"] 选择上下文节点的第 5 个 <para> 子级(如果该子级的 type 属性值为 "warning".)。
child::chapter[child::title="Introduction"] 选择上下文节点中包含一个或多个字符串值等于“Introduction”的 <title> 子级的 <chapter> 子级。
child::chapter[child::title] 选择上下文节点中包含一个或多个 <title> 子级的 <chapter> 子级。
child::*[self::chapter or self::appendix]
child::*[self::chapter or self::appendix][position()=last()] 选择上下文节点的最后一个 <chapter> 或 <appendix> 子级。
9、XPATH示例
XPATH函数
节点集函数
count 函数 返回 node-set 参数中的节点数。
id 按照唯一 ID 选择元素。
last 返回的数字等于表达式计算上下文的上下文大小。
local-name 返回 node-set 参数中按文档顺序处于第一位的节点的扩展名称本地部分。
name 返回的字符串包含一个 QName,该 QName 表示 node-set 参数中按文档顺序处于第一位的节点的扩展名称。
namespace-uri 返回 node-set 参数中按文档顺序处于第一位的节点的扩展名称的命名空间统一资源标识符 (URI)。
position 返回节点在父级中的索引号。
字符串函数
concat 返回参数的串联。
contains 如果第一个参数字符串包含第二个参数字符串,则返回 true;否则,返回 false。
normalize-space 返回去除了空白的参数字符串。
starts-with 如果第一个参数字符串以第二个参数字符串开头,则返回 true;否则,返回 false。
string 将对象转换为字符串。
string-length 返回字符串中的字符数。
substring 返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子字符串。
substring-after 返回第一个参数字符串中第一次出现第二个参数字符串之后的子字符串。
substring-before 返回第一个参数字符串中第一次出现第二个参数字符串之前的子字符串。
translate 返回第一个参数字符串,出现第二个参数字符串中的字符的位置替换为第三个参数字符串中对应位置的字符。
布尔函数
boolean 将参数转换为布尔值。
false 返回 false。
lang 如果上下文节点的 xml:lang 属性与参数字符串相同,则返回 true。
not 如果参数为 false,则返回 true,否则,返回 false。
true 返回 true。
数值函数
ceiling 返回不小于参数的最小整数。
floor 返回不大于参数的最大整数。
number 将参数转换为数字。
round 返回与参数最接近的整数值。
sum 返回节点集中所有节点的总和。每个节点在求和之前先转换为数值。
Microsoft XPATH扩展函数
针对 XSD 的 XPath 扩展函数支持
ms:type-is 将当前节点的数据类型与指定的节点类型进行比较。
ms:type-local-name ([node-set]) 返回当前节点或所提供节点集中的第一个节点(按文档顺序)的 XSD 类型的非限定名称。
ms:type-namespace-uri ([node-set]) 返回与当前节点或所提供节点集中的第一个节点(按文档顺序)的 XSD 类型关联的命名空间 URI。
ms:schema-info-available 如果当前节点有 XSD 信息,则返回 true。
其他实用程序的 XPath 扩展函数
ms:string-compare 执行按字典序的字符串比较。
ms:utc 将带前缀的与日期/时间有关的值转换为协调通用时间以及可以按字典序进行排序和比较的固定(标准化)显示。
ms:namespace-uri 将限定名称的前缀部分解析为命名空间 URI。
ms:local-name 通过去除命名空间前缀,返回限定名称的本地部分。
ms:number 接受 XSD 格式的字符串参数并将其转换为 XPath 数字。
ms:format-date 将标准的 XSD 日期格式转换为适合输出的字符。
ms:format-time 将标准的 XSD 时间格式转换为适合输出的字符。
XQuery
XQuery是用来从XML文档查找和提取元素及属性的语言。XQuery相对于XML的关系等同于SQL相对于数据库表的关系。XQuery被设计用来查询XML数据 - 不仅仅限于XML文件,还包含任何可以XML形态呈现的数据,包括数据库。
XQuery 1.0和XPath 2.0共享相同的数据模型,并支持相同的函数和运算符。
XML实例文档
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
如何从"books.xml"选取节点?
函数
XQuery使用函数来提取XML文档中的数据。
doc()用于打开"books.xml"文件:doc("books.xml")
路径表达式
XQuery使用路径表达式在XML文档中通过元素进行导航。
下面的路径表达式用于在"books.xml"文件中选取所有的title元素:doc("books.xml")/bookstore/book/title
谓语
XQuery使用谓语来限定从XML文档所提取的数据。
下面的谓语用于选取bookstore元素下的所有book元素,并且所选取的book元素下的price元素的值必须小于30:doc("books.xml")/bookstore/book[price<30]
如果使用FLWOR从"books.xml"选取节点
FLWOR是"For, Let, Where, Order by, Return"的只取首字母缩写。
for语句把bookstore元素下的所有book元素提取到名为$x的变量中。
where语句选取了price元素值大于30的book元素。
order by语句定义了排序次序。将根据title元素进行排序。
return语句规定返回什么内容。在此返回的是title元素。
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
XQuery的基础语法规则
XQuery对大小写敏感
XQuery的元素、属性以及变量必须是合法的XML名称。
XQuery字符串值可使用单引号或双引号。
XQuery变量由“$”并跟随一个名称来进行定义,举例,$bookstore
XQuery注释被(:和:)分割,举例,(: XQuery 注释 :)
XQuery 条件表达式
"If-Then-Else"可以在XQuery中使用。
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
请注意"If-Then-Else"的语法:if表达式后的圆括号是必需的。else也是必需的,不过仅仅写“else ()”也是可以的。
XQuery 比较
在XQuery中,有两种方法来比较值。
通用比较:=, !=, <, <=, >, >=
值的比较:eq、ne、lt、le、gt、ge
这两种比较方法的差异如下:
请看下面的XQuery表达式:
$bookstore//book/@q > 10如果q属性的值大于10,上面的表达式的返回值为true。
$bookstore//book/@q gt 10如果仅返回一个q,且它的值大于10,那么表达式返回true。如果不止一个q被返回,则会发生错误。
参考文档
http://msdn2.microsoft.com/zh-cn/library/ms256081(VS.80).aspx
http://www.w3school.com.cn/xquery/