首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

在上一章的内容中,介绍了XSLT的本质,以及如何在Stylus Studio中查看其转换的输出效果。XSLT虽然本质上仍然是XML文档,但能被处理器解释执行;从编程的角度来看,又可以看做一门编程语言。本章将从编程语言的角度讲述XSLT的基础知识。

8.1  进一步思考XSLT的本质

XSLT表面看起来很简单,实际上具有了编程语言的许多特点,本节将就此进行简单讨论。

8.1.1  XSLT是一门编程语言

结合上一章的实例,XSLT在以下几方面具有编程语言的特点。

—  XSLT有一个输入——XML源文档,有一个输出——XML目标文档(或TEXT、HTML文档)。

—  XSLT有固定语法。如xsl:value-of用于输出某个对象的文本内容,类似于print方法;xsl:template用于为某些对象定义模板,模板用来定义如何处理对象,类似于自定义函数(过程)。

—  XSLT有一个固定的程序入口。XSLT处理过程总是从根节点的模板开始执行(后面将有详细讲解),类似于main()方法或init事件。

—  XSLT的每个版本都能保证向后兼容。XSLT 2.0对XSLT 1.0有着很好的兼容性,这也是其他编程语言所具有的特点。

—  XSLT有固定的解释编译程序。

8.1.2  XSLT相对其他语言的特点

XSLT作为一门编程语言,也有着自己独有的特点。具体表现在如下几个方面。

—  XSLT只能够用来处理XML文档,即其输入只能是XML文档。

— 可扩展性强。这也是XML文档的特点之一。XSLT由于其语法实现均由特定名称空间内的元素或属性决定,扩展名称空间内的元素和属性,显然要比升级一门单纯的编程语言要简单得多。

—  XSLT的功能远远达不到一门独立编程语言强大的程度,实际上也没有这个必要。例如,虽然XSLT也能定义变量,但是变量值一经设定,不可更改。

—  XSLT编程的主要工作是对需要处理的XML文档中的节点(元素、属性)定义处理模板,是基于对象的;同时,控制程序执行是通过在一个模板中调用另外的模板,又有面向过程的特点。

8.2  XML文档结构描述——XPath

XSLT的主要工作是为节点(元素、属性等)定义处理模板。为了对XML文档中的节点进行寻址,经常使用被称为XPath的描述方法。

8.2.1  什么是XPath

XML文档有着很强的结构性。XML文档可以看做一个节点树;每个XML文档中的元素、属性、文本和注释都可以看做树的节点。XPath是可扩展路径(eXtensible Path)的缩写,主要用来寻址XML文档树中的节点。清单8-1演示了一个典型的XML文档。

清单8-1  一个典型的XML文档

<?xml version="1.0"?>

<items>

  <item id="001">first</item>

  <item id="002">second</item>

  <item id="003">third</item>

</items>

在上面的XML文档中,元素<items>、<item>,属性id,文本first、second、third都是节点。图8-1演示了该XML文档的节点树模型。

图8-1  清单8-1对应的节点树

8.2.2  XPath表达式简介

XPath在实际应用中总是通过XPath表达式的形式来表现。XPath的意义在于描述XML文档树结构,但XPath表达式的意义却并不仅限于此。XPath表达式的计算结果可以是节点集合、字符串、数值、布尔值等4种类型的一种。XPath表达式的语法如下所示。

— 节点:在一个XML文档中,元素、属性、文本、注释等都可以看做节点。最常用的节点为元素、属性和文本。值得注意的是,属性和属性值(例如,id="001")被看做一个节点;元素和元素的文本内容(例如,<name>张三</name>)则被看做两个节点。

— 根节点:根节点不同于XML文档的根元素。XML文档的根元素是实际存在于XML文档中的元素,如清单8-1中的元素<items>。XPath表达式中的根节点可以看做XML源文档本身,根节点是根元素的父节点。XPath表达式中使用字符“/”来代表根节点。

— 上下文节点:上下文节点是指根据上下文环境确定的节点。XPath表达式中使用字符“. ”来代表上下文节点。可以将上下文节点暂时视为正在处理的节点(当前节点)。后面会专门讲述上下文节点和当前节点的区别。

— 元素节点:XPath表达式中使用元素名来代表上下文节点的子元素节点。例如,XPath表达式“item”表示上下文节点下所有<item>子元素的集合。

— 属性节点:XPath表达式中使用“@+属性名”来代表上下文节点的属性节点。例如,XPath表达式“@id”表示上下文节点的id属性。

— 所有子元素节点:XPath表达式中使用“*”表示上下文节点的所有子元素节点。

— 所有属性节点:XPath表达式中使用“@*”表示上下文节点的所有属性节点。

— 父节点:XPath表达式中使用“..”表示上下文节点的父元素节点。

— 所有节点:XPath表达式中使用node()函数表示所有类型的节点。

— 文本节点:XPath表达式中使用text()函数表示文本节点。

— 父子关系:XPath表达式中用字符“/”表示父子关系。例如,XPath表达式“items    /item”表示<items>元素下所有<item>元素节点。

— 祖先后代关系:XPath表达式中用字符串“//”表示祖先后代关系。例如,XPath表达式“items//item”表示以元素<items>为祖先的所有<item>元素节点。值得注意的是,父子关系也被包含在祖先后代关系之内。

— 并列关系:XPath表达式中用字符“|”表示并列关系。例如,XPath表达式“a|b”表示元素a和元素b。实际上是包含元素<a>和元素<b>的节点集。

— 约束关系:XPath表达式中用“[]”(中括号)括起来的一个XPath表达式来约束另一个XPath表达式。例如,XPath表达式“items/item[1]”表示元素<items>下的第一个<item>元素。注意,中括号内的表达式必须是XPath表达式。

★ 说明 ★

节点不等于元素,元素只是节点的一种,节点还包括了另外几种,如属性节点、文本节点、注释节点等。

8.2.3  XPath和XSLT的关系

尽管笔者将XPath放在了XSLT部分来介绍,但并不意味着XPath是XSLT语言的一部分。实际上,XPath的使用并不仅限于XSLT。虽然XSLT是XPath的最主要的使用环境,但在其他地方仍有广泛应用。例如,在前面讲述Schema的unique和key的用法的时候,使用了XPath表达式;在XQuery(XML查询语言)中,XPath表达式也起到了重要作用。为了兼顾多方面的需求,XPath被设计为完全独立于XSLT存在的一种规范。实际上,它不依赖于任何一种实际应用。

8.2.4  典型实例

下面通过一个具体的实例,来看一下如何使用XPath表达式。清单8-2演示了利用   XSLT将清单8-1所示的XML文档转换为HTML文档。转换后的HTML文档显示了第一个<item>元素和第三个<item>元素及其属性id。

清单8-2  XPath的使用实例

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <html>

      <body>

        <table border="1">

          <tr align="center">

            <td>第一个item的值</td>

            <td>第一个item的id</td>

            <td>第三个item的值</td>

            <td>第三个item的id</td>

          </tr>

          <tr align="center">

            <td>

              <xsl:value-of select="items/item[1]"/>

            </td>

            <td>

              <xsl:value-of select="items/item[1]/@id"/>

            </td>

            <td>

              <xsl:value-of select="items/item[3]"/>

            </td>

            <td>

              <xsl:value-of select="items/item[3]/@id"/>

            </td>

          </tr>

        </table>

      </body>

    </html>

  </xsl:template>

</xsl:stylesheet>

代码说明:

— 除了以“xsl”为前缀的元素会被处理器按XSLT元素进行解释执行外,其他代码都按原样输出。例如,<html>会在目标文档中生成<html>标签。

—  <xsl:template match="/">是为根节点定义模板。模板实际上定义了一组操作指令,表明针对该节点将执行哪些命令。

—  <xsl:value-of select="items/item[1] "/>表示输出上下文节点下的<items>元素下第一个<item>子元素的文本内容。因为该语句处在根结点的模板中,所以在这里,上下文节点为根节点。在XML文档中,select属性指定的元素存在,并且输出内容应该为字符串“first”。同理<xsl:value-of select="items/item[3] "/>应该输出字符串“third”。

—  <xsl:value-of select="items/item[1]/@id"/>表示输出上下文节点下的<items>元素下第一个<item>子元素的属性id的值。该语句将输出字符串“001”;同理<xsl:value-of select="items/item[3]/@id"/>将输出字符串“003”。

经转换后的目标HTML文档如图8-2所示。

图8-2  目标HTML文档

8.3  常用XSLT函数概述

XSLT中使用的函数分为两类,XSLT内置函数和XPath函数。内置函数是指XSLT本身自带的函数,XPath函数则是由XPath规范定义的函数。在前面的内容曾经提到,XPath是完全独立于XSLT的。所以,XPath函数也可以在其他场合使用,如应用于XQuery中。

XSLT本身仅提供了9个内置的函数。但是这些函数结合XSLT元素、XPath函数使用却能发挥强大的作用。本节将重点介绍其中最常用的几个。

★ 注意 ★

在笔者看来,在XSLT的学习过程中区分这两类函数的意义并不大,而且刻意区分这两类函数反而有可能带来更多的迷惑。除非还在别的场合使用XPath函数,因为那时不能使用XSLT内置函数。

8.3.1  current()函数——返回当前节点

语法:current()

参数:无

返回值:节点集

用途:current()函数,顾名思义,其作用为返回仅含当前节点的节点集合。注意,这里返回值是XPath表达式,因为节点集正是XPath4种数据类型中的一种。

以下示例程序演示了current()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<aninmals>

  <animal>tiger</animal>

  <animal>wolf</animal>

  <animal>lion</animal>

  <animal>dog</animal>

</aninmals>

该XML源文档存储了若干动物信息。要输出各动物的名字,相应的XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/animals">

    <xsl:for-each select="animal">

      <xsl:value-of select="current()"/>

    </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  <xsl:template match="/animals">用于为根节点下的<animals>元素定义模板。

—  <xsl:for-each select="animal">是对<animal>元素集合中的每个节点进行循环处理。

—  <xsl:value-of select="current()"/>用于输出当前节点的值。在上例中,实际输出为<animal>元素的文本内容。

转换结果如下所示。

tiger

wolf

lion

dog

★ 注意与说明 ★

在上例中,current()所指的当前节点和上下文节点“.”没有区别。在一般情况下,这二者没有区别。但是这二者并不完全相同,后面将有详细讲解。current()函数返回当前节点,这意味着节点有可能是元素、属性、文本等,并不一定是元素。

8.3.2  document()函数——使用外部XML文档

语法:document(URL)

参数:URL,字符串,必需

返回值:节点集

用途:document(URL)函数,可以将一个外部XML文档(并非用来转换的XML源文档)解析为一个XML节点树,该节点树可以被直接引用。参数URL指定了外部XML文档的物理地址。

以下示例程序演示了document ()函数的用法。

document.xml如下所示。

<?xml version="1.0"?>

<person>周良</person>

XML源文档如下所示。

<?xml version="1.0"?>

<people>

  <person>张军</person>

  <person>李松</person>

  <person>周良</person>

  <person>宋刚</person>

</people>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="people">

    <xsl:for-each select="person">

      <xsl:if test="document('document.xml')/person=.">

        <xsl:value-of select="."/>

        <xsl:text>的位置在</xsl:text>

        <xsl:value-of select="position()"/>

      </xsl:if>

    </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  document('document.xml')将document.xml文档转换为一个节点树。document()函数可以看做节点树的根节点。

—  <xsl:if test="document('document.xml')/person=.">是一个条件判断。判断document.xml中的根元素<person>是否和上下文节点相等。

— 转换后的结果如下所示。

周良的位置在3

★ 说明 ★

document()函数返回的节点集在访问时,可以完全按照XPath表达式的格式进行。根节点即为document(URI)。

8.3.3  element-available()函数——判断元素可用性

语法:element-available(string)

参数:string,字符串,必需

返回值:布尔型

用途:该函数用来判断某个XSLT元素是否能够被处理器解析。参数string用来指定 XSLT元素的名称。只有可作为元素<xsl:template>的子元素出现的XSLT元素才会返回true,这些元素列表如下所示。

—  <xsl:apply-imports>

—  <xsl:apply-templates>

—  <xsl:attribute>

—  <xsl:call-template>

—  <xsl:choose>

—  <xsl:comment>

—  <xsl:copy>

—  <xsl:copy-of>

—  <xsl:element>

—  <xsl:fallback>

—  <xsl:for-each>

—  <xsl:if>

—  <xsl:message>

—  <xsl:number>

—  <xsl:processing-instruction>

—  <xsl:text>

—  <xsl:value-of>

—  <xsl:variable>

★ 注意 ★

顶层元素(例如<xsl:template>、<xsl:key>、<xsl:include>等)和不能用做<xsl:template>直接子元素的元素(例如<xsl:otherwise>、<xsl:when>等)用于判断时,将返回false。

以下示例程序演示了element-available ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<song>

  <author>Robert</author>

  <title>The daughter of sea </title>

  <country>America</country>

 </song>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/song">

    <xsl:choose>

      <xsl:when test="element-available('xsl:type')">

        <xsl:value-of select="’Available’"/>

      </xsl:when>

      <xsl:otherwise>

        <xsl:value-of select="’Inavailable’"/>

      </xsl:otherwise>

    </xsl:choose>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  <xsl:choose>用于创建一个多条件选择。

—  <xsl:when test="element-available('xsl:type')">是一个分支条件判断,如果test的值为真,将执行分支内的处理语句。test="element-available('xsl:type')"用于判断元素<xsl:type>是否可用的XSLT元素。

—  <xsl:otherwise>是一个默认条件分支。当<xsl:choose>下所有的<xsl:when>的条件都不成立时,将使用<xsl:otherwise>分支内的处理语句进行处理。

转换结果如下所示。

Inavailable'

可见,element-available('xsl:type')返回为false。

8.3.4  format-number()函数——格式化数字

语法:format-number(number,format)

参数:number,数值型,必需;format,字符串,必需

返回值:数值

用途:该函数用于将某个数字转换为指定格式。参数number用于指定要转换的数字;参数format用于指定转换目标的数字格式。

以下示例程序演示了format-number()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<numbers>

  <number>78</number>

  <number>12.56</number>

  <number>7.89</number>

  <number>34.5789</number>

  <number>Account</number>

</numbers>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/numbers">

    <number>

    <xsl:for-each select="number">

      <xsl:copy>

        <xsl:value-of select="format-number(.,'#.000')"/>

      </xsl:copy>

    </xsl:for-each>

    </number>

  </xsl:template>

</xsl:stylesheet>

代码说明:format-number(.,'#.000')是指将上下文节点的值精确到小数点后三位。

转换结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<number>

  <number>78.000</number>

  <number>12.560</number>

  <number>7.890</number>

  <number>34.579</number>

  <number>NaN</number>

</number>

★ 注意 ★

format-number()在进行格式转换时,在临界位上采用四舍五入的方法。如果format-number()函数无法将某个节点的值进行转换,将返回字符串“NaN”,表示非数字(Not a Number)。

8.3.5  function-available()函数——判断函数可用性

语法:function-available(string)

参数:string,字符串,必需

返回值:布尔值

用途:该函数用于测试某个函数是否为可以被XSLT处理器解析。参数string用于指定要测试的函数名。

以下示例程序演示了function-available ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<CD>

  <name>Go Home</name>

  <author>Jack</author>

  <date>1999</date>

  <price>13.0</price>

</CD>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/CD">

    <xsl:choose>

      <xsl:when test="function-available('current')">

        <xsl:copy-of select="."/>

      </xsl:when>

      <xsl:otherwise>

        <xsl:value-of select="'The function current() is unavailable '"/>

      </xsl:otherwise>

    </xsl:choose>

  </xsl:template>

</xsl:stylesheet>

转换结果如下所示。

Go Home

Jack

1999

13.0

转换结果表明current()函数是存在的。

★ 注意 ★

在这里测试的函数,既可以是XPath的函数,也可以是XSLT的函数。如果使用  Stylus Studio,请选择built-in处理器以外的其他处理器。

8.3.6  generate-id()函数——生成节点id

语法:generate-id(node)

参数:node,节点,可选

返回值:整数

用途:该函数用于为某个节点生成唯一id。参数node,用于指定为哪个节点生成唯一id。注意,该id值每次运行XSLT转换时都不相同,而且任意两个节点的id值也不相同。当参数node缺省时,将返回上下文节点的唯一id。

示例代码详见第13章,XSLT应用——分组。

8.3.7  key()函数——返回索引中的节点

语法:key(string,object)

参数:string,字符串,必需;object,字符串,必需

返回值:节点集合

用途:该函数用于在一个索引中依照key值搜索对应的节点。参数string用于指定索引对象的名字;参数object用于指定查找时的key值。

示例代码详见第13章,XSLT应用——分组。

8.3.8  system-property()函数——返回系统属性

语法:system-property(string)

参数:string,必需

返回值:XPath表达式

用途:用于返回某个系统属性的值。string,用于指定系统属性的名字。

以下示例程序演示了system-property ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>001</root>

代码说明:在这里XML源文档并没有参与转换,但是每个XSLT转换必须要有XML源文档。

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <xsl:text>version:</xsl:text>

    <xsl:value-of select="system-property('xsl:version')"/>

    <xsl:text>&#x000A;vendor:</xsl:text>

    <xsl:value-of select="system-property('xsl:vendor')"/>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  system-property('xsl:version')用于返回当前XSLT版本。

—  system-property('xsl:vendor')用于返回生产商的名称。

转换结果如下所示。

version:1.0

vendor:Progress Software Corporation

8.4  XPath节点集函数

在上一节的内容中,讲述了XSLT内置函数的基础知识,本节将介绍XPath的常用函数。XPath的数据类型有节点集合、字符串、数值、布尔值4种,XPath函数按数据类型分为4类。本节所介绍的函数中,对简单易懂的函数将不进行代码举例。

节点集函数是指主要用来处理节点集的函数。节点集函数主要包括以下几种:count(),position(),last()和name(),本节将结合示例代码介绍这几种函数。

8.4.1  count()函数——统计节点个数

语法:count(node-set)

参数:node-set,节点集,必需

返回值:整数

用途:该函数用于计算某个节点集合中的节点数目。参数node-set用于指定节点集合。

以下示例程序演示了count ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<records>

   <record id="001">This is the first record</record>

   <record id="002">This is the first record</record>

   <record id="003">This is the first record</record>

   <record id="004">This is the first record</record>

   <record id="005">This is the first record</record>

</records>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

     records: <xsl:value-of select="count(records)"/>

    record/record: <xsl:value-of select="count(records/record)"/>

    records|records/record: <xsl:value-of select="count(records|records/record)"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

records: 1

record/record: 5

records|records/record: 6

★ 注意与说明 ★

count()函数的参数必须是一个表示节点集合的XPath表达式。如果所选定的节点集合为空,则该函数返回值为0。

8.4.2  position()函数——返回节点位置

语法:position()

参数:无

返回值:整数

用途:该函数用于返回上下文节点在正在处理的节点集合中的位置。

以下示例程序演示了position()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>

   <e pos="1">001</e>

   <e pos="2">002</e>

   <e pos="3">003</e>

   <e pos="4">004</e>

   <e pos="5">005</e>

</root>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

    <xsl:for-each select="root/e">

      第<xsl:value-of select="position()"/>个e元素:<xsl:value-of select="."/>

    </xsl:for-each>

</xsl:template>

</xsl:stylesheet>

输出结果如下所示。

第1个e元素:001

第2个e元素:002

第3个e元素:003

第4个e元素:004

第5个e元素:005

8.4.3  last()函数——返回节点总数

语法:last()

参数:无

返回值:整数

用途:该函数返回正在处理的节点集合中,最后一个节点的位置。实际上也就是正在处理的节点集合的节点总数。

以下示例程序演示了last()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>

   <e pos="1">001</e>

   <e pos="2">002</e>

   <e pos="3">003</e>

   <e pos="4">004</e>

   <e pos="5">005</e>

</root>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">

          <xsl:for-each select="root/e">

            <xsl:if test="position()=last()">

              <xsl:value-of select="@pos"/>

            </xsl:if>

          </xsl:for-each>

    </xsl:template>

</xsl:stylesheet>

代码说明:

—  <xsl:for-each>对所选定的节点集进行循环处理。select属性用于选择要处理的节点集。在上例中,所选节点集为元素<root>下所有子元素<e>。

—  <xsl:if>用于建立条件判断。test属性用于计算一个XPath表达式所返回的值。在上例中,如果上下文节点是最后一个节点,将返回“真”。

输出结果如下所示。

5

8.4.4  name()函数——返回节点名称

语法:name(node-set)

参数:node-set,节点集,可选

返回值:字符串

用途:该函数用于返回节点集合node-set中第一个节点的节点名称。

以下示例程序演示了name()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>

  <aa>1234444</aa>

  <bb>3455555</bb>

</root>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <xsl:value-of select="name(root/*)"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

aa

★ 说明 ★

name()函数参数缺省时,将返回上下文节点的节点名称。当参数为根节点时,将返回字符串“#document”。

8.5  XPath字符串函数

字符串函数是指主要用来处理字符串的函数。字符串函数主要包括以下几种:concat(),contains(),normalize-space(),substring(),substring-before(),substring-after()和translate()。本节将结合示例代码介绍这几种函数。

8.5.1  concat()函数——连接字符串

语法:concat(string1,string2,string3….)

参数:string1,string2,string3….字符串,至少两个

返回值:字符串

用途:该函数用于串连多个字符串。

以下示例程序演示了concat()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>

   <e pos="1">st</e>

   <e pos="2">nd</e>

   <e pos="3">rd</e>

   <e pos="4">th</e>

   <e pos="5">th</e>

</root>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/root">

    <xsl:for-each select="e">

      <xsl:value-of select="concat(@pos,.,'&#x000A;')"/>

    </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  concat(@pos,.,'&#x000A;')表示将上下文节点的pos属性,上下文节点,都转化为字符串,然后与字符串“&#x000A;”串连。

— “&#x000A;”是一个字符引用,实际代表了换行符。因为函数concat()处于双引号中,所以字符引用必须要加单引号。

输出结果如下所示。

1st

2nd

3rd

4th

5th

★ 说明 ★

concat()中的每个参数实际上还是XPath表达式,所以对于纯字符串,必须要使用引号标识。

8.5.2  contains()函数——判断包含关系

语法:contains(string1,string2)

参数:string1,字符串,必需;string2,字符串,必需

返回值:布尔值

用途:判断第二个字符串string2是否是第一个字符串string1的一部分。

以下示例程序演示了contains()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<books>

  <book>

    <name>Matering XML</name>

    <authors>Jack Mark Mike</authors>

    <date>1981-08-01</date>

  </book>

  <book>

    <name>Matering Java</name>

    <authors>Jack Mike Joe</authors>

    <date>1988-09-01</date>

  </book>

  <book>

    <name>Matering C#</name>

    <authors>Jack Mark Kin</authors>

    <date>1991-08-01</date>

  </book>

  <book>

    <name>Matering C++</name>

    <authors>Mark Alex</authors>

    <date>1993-11-11</date>

  </book>

</books>

假使要从中选择Mark参与编著的书籍,那么相应的XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/books">

    <books author="Mark">

      <xsl:for-each select="book">

        <xsl:if test="contains(.,'Mark')">

          <xsl:copy>

            <xsl:value-of select="name"/>

          </xsl:copy>

        </xsl:if>

      </xsl:for-each>

    </books>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<books author="Mark">

  <book>Matering XML</book>

  <book>Matering C#</book>

  <book>Matering C++</book>

</books>

★ 注意 ★

contains()函数用于判断第一个字符串是否包含第二个字符串,而不是第二个包含第一个。这从函数名contains可以看出来。contains是一个动词,而且是主动形式,不是被动形式。

8.5.3  normalize-space()函数——格式化空白符

语法:normalize-space(string)

参数:string,字符串,可选

返回值:字符型

用途:该函数用于将一个字符串的头部和尾部的空白字符删除,如果字符串中间含有连续多个空白字符,那么将用一个空格来代替。string用于指定要进行处理的字符串。

以下示例程序演示了normalize-space ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<article>

  <title>   When   The Wind Blows </title>

  <paragraph>

     When you have get ready for everything,you could            

                                   Sleep though  the wind blows

  </paragraph>

  <paragraph>

    That means you should         do your best on your work  and fear

    nothing

  </paragraph>

</article>

在上面的XML文档中,元素<title>、<paragraph>都含有大量的空白字符。

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/">

    <xsl:apply-templates select="article"/>

  </xsl:template>

  <xsl:template match="article">

    <xsl:copy>

      <xsl:apply-templates select="*"/>

    </xsl:copy>

  </xsl:template>

  <xsl:template match="*">

    <xsl:copy>

      <xsl:value-of select="normalize-space()"/>

    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>

代码说明:<xsl:value-of select="normalize-space()"/>中normalize-space()函数没有参数,表明是对上下文节点进行操作。

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<article>

  <title>When The Wind Blows</title>

  <paragraph>When you have get ready for everything,you could Sleep though the wind blows</paragraph>

  <paragraph>That means you should do your best on your work and fear nothing</paragraph>

</article>

★ 说明 ★

空白字符是指空格符、制表符、回车符、换行符。对于处在字符串内部的连续空白字符,无论有多少个,都会被替换成单个空格符。

8.5.4  starts-with()函数——判断开头字符串

语法:starts-with(string1,string2)

参数:string1,字符串,必需;string2,字符串,必需

返回值:布尔值

用途:该函数用于判断字符串string1是否以字符串string2开头。

以下示例程序演示了starts-with ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<cars>

   <car>京A00109</car>

   <car>冀C00786</car>

   <car>京A00109</car>

   <car>辽A81099</car>

   <car>粤C13782</car>

   <car>京A35628</car>

</cars>

该文档是一个关于汽车牌照的XML文档。现在需要选择所有北京的汽车,对应的XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/cars">

    <xsl:copy>

      <xsl:for-each select="car">

        <xsl:if test="starts-with(.,'京')">

          <xsl:copy-of select="."/>

        </xsl:if>

      </xsl:for-each>

    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>

代码说明:<xsl:if test="starts-with(.,'京')">用来判断上下文节点是否以字符“京”开头。

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<cars>

  <car>京A00109</car>

  <car>京A00109</car>

  <car>京A35628</car>

</cars>

★ 注意与说明 ★

与contains()函数类似,通过动词starts-with为主动形式,可以看出该函数用于判断第一个字符串是否以第二个字符串开头。

8.5.5  string-length()函数——返回字符串长度

语法:string-length(string)

参数:string,字符串,可选

返回值:整数

用途:该函数用于返回参数string的长度。如果参数string缺省,那么将返回上下文节点的字符串长度。

8.5.6  substring()函数——截取字符串

语法:substring(string,number,length)

参数:string,字符串,必需;number,整数,必需;length,整数,可选

返回值:字符串

用途:该函数用于截取字符串。参数string用于指定要截取哪个字符串;参数number用于指定开始位置;参数length用于指定截取字符串的长度。如果缺少了length参数,那么将从开始位置number一直截取到字符串结束。

以下示例程序演示了substring()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<root>

  <branch>123456789ABCDEF</branch>

</root>

代码说明:该文档是关于十六进制1-F的一串字符。

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/root">

    <xsl:value-of select="substring(branch,1,5)"/>

    <xsl:text>&#x000A;</xsl:text>

    <xsl:value-of select="substring(branch,1)"/>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  <xsl:value-of select="substring(branch,1,5)"/>用于从元素<branch>的内容中的第一个字符开始,截取5个字符。

—  <xsl:value-of select="substring(branch,1)"/>没有指定要截取多少个字符,那么处理器将从第一个字符开始截取,一直到最后一个字符结束。

输出结果如下所示。

12345

123456789ABCDEF

8.5.7  substring-before()函数——向前截取字符串

语法:substring-before(string1,string2)

参数:string1,字符串,必需;string2,字符串,必需

返回值:字符串

用途:substring-before()函数用于返回字符串string1中位于字符串string2之前的部分。

以下示例程序演示了substring-before ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<dateTime>

  <date>2007-05-01</date>

  <time>06:55:03</time>

</dateTime>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/dateTime">

    <xsl:apply-templates select="*"/>

  </xsl:template>

  <xsl:template match="date">

    <xsl:value-of select="concat(substring-before(.,'-'),'年')"/>

  </xsl:template>

  <xsl:template match="time">

    <xsl:value-of select="concat(substring-before(.,':'),'时')"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

2007年06时

★ 注意与说明 ★

substring-before()函数用于返回第一个字符串中,第二个字符串出现之前的字符串。这里的出现是指首次出现。

8.5.8  substring-after()函数——向后截取字符串

语法:substring-after(string1,string2)

参数:string1,字符串,必需;string2,字符串,必需

返回值:字符串

用途:substring-after()函数用于返回字符串string1中位于字符串string2之后的部分。

以下示例程序演示了substring-after ()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<directory>

  <file>text.txt</file>

  <file>example.xml</file>

  <file>translate.xsl</file>

  <file>check.xsd</file>

  <file>page.htm</file>

</directory>

该XML文档存储了一个目录下文件名的信息。要取得所有文件后缀,对应XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/directory">

    <prefixes>

      <xsl:for-each select="file">

        <prefix>

          <xsl:value-of select="substring-after(.,'.')"/>

        </prefix>

      </xsl:for-each>

    </prefixes>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<prefixes>

  <prefix>txt</prefix>

  <prefix>xml</prefix>

  <prefix>xsl</prefix>

  <prefix>xsd</prefix>

  <prefix>htm</prefix>

</prefixes>

★ 说明 ★

substring-after()函数用于返回第一个字符串中,第二个字符串出现之后的字符串。这里的出现是指首次出现。

8.5.9  translate()函数——替换字符

语法:translate(string,replaced_text,replacement_text)

参数:string,字符串,必需;replaced_text,字符串,必需;replacement_text,字符串,必需

返回值:字符串

用途:在第一个字符串string中,依次查找第二个字符串replaced_text的每个字符。如果找到,就使用第三个字符串replacement_text中对应位置的字符进行替换。

以下示例程序演示了translate()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<article>

 Because projects are finite endeavors with limited time,money,and other resources available,they must be kept moving toward completion.Since most team members have lots of other priorities,it’s up to the project manager to keep their attention on project deliverables and deadlines.Regular status checks,meetions,and reminders are essential.

</article>

想要统计该XML文档中的逗号的个数,对应XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <xsl:value-of select="string-length(article)-string-length(translate(article, ',',''))"/>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  string-length(article)用于统计<article>元素的字符总数。

—  string-length(translate(article,',',''))首先将<article>元素中的逗号全部用空字符(不是空格)来代替,以删除所有逗号。再使用string-length函数统计此时的字符串长度。

— 两个长度相减所得的数字,即为逗号的个数。

★ 说明 ★

如果参数replacement_text的长度短于参数replaced_text的长度,那么,没有替换字符的对应字符将使用空来代替,也就是直接删除,如上例所示。

8.6  XPath数值型函数

数值型函数是指主要用于处理数值的函数,数值型函数主要有以下几种:ceiling(), floor(),number(),round()和sum()。

8.6.1  ceiling()函数——上取整

语法:ceiling(number)

参数:number,数值

返回值:整数

用途:该函数用于返回大于或等于参数number的最小整数。

以下示例程序演示了ceiling()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<product per="4">

 <quantity>18</quantity>

</product>

该XML文档中,per属性表示每个单位的产品数量;<quantity>元素代表产品的总数量。现在欲给<product>元素增加一个子元素<units>,以标识单位的数目,相应的XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/product">

    <xsl:copy>

      <xsl:copy-of select="@per"/>

      <xsl:copy-of select="quantity"/>

      <xsl:element name="unit">

        <xsl:value-of select="ceiling(quantity div @per)"/>

      </xsl:element>

    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>

代码说明:

—  quantity div @per是除法运算,得到数量与单位的商。

—  ceiling(quantity div @per)将除法运算的值,向上取整,得到一个大于等于该商的最小整数。

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<product per="4">

  <quantity>18</quantity>

  <unit>5</unit>

</product>

8.6.2  floor()函数——下取整

语法:floor(number)

参数:number,数值型,必需

返回值:整数

用途:用于返回小于等于数值number的最大整数。

以下示例程序演示了floor()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<products>

  <product>

    <name>猪肉</name>

    <price>12.09</price>

  </product>

   <product>

     <name>牛肉</name>

     <price>11.89</price>

  </product>

  <product>

     <name>鸡肉</name>

     <price>8.0</price>

  </product>

  <product>

    <name>鸡蛋</name>

    <price>4.6</price>

  </product>

  <product>

    <name>青菜</name>

    <price>0.9</price>

  </product>

</products>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/products">

    <xsl:for-each select="product">

      <xsl:choose>

        <xsl:when test="price &lt; 1">

          <xsl:value-of select="concat(name,'价格低于1元')"/>

        </xsl:when>

        <xsl:when test="price = floor(price)">

          <xsl:value-of select="concat(name,'价格为',floor(price),'元整')"/>

        </xsl:when>

        <xsl:otherwise>

          <xsl:value-of select="concat(name,'价格稍高于',floor(price),'元')"/>

        </xsl:otherwise>

      </xsl:choose>

      <xsl:text>&#x000A;</xsl:text>

    </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

猪肉价格稍高于12元

牛肉价格稍高于11元

鸡肉价格为8元整

鸡蛋价格稍高于4元

青菜价格低于1元

8.6.3  number()函数——数值转换

语法:number(xpathExpression)

参数:xpathExpression,XPath表达式,可选

返回值:数值型

用途:该函数用于将参数xpathExpression的值转换为数值。

以下示例程序演示了number()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<xpath>

  <expression>string</expression>

  <expression>21</expression>

  <expression>true</expression>

</xpath>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/xpath">

    <xsl:for-each select="expression">

      <xsl:value-of select="number()"/>

      <xsl:text>&#x000A;</xsl:text>

    </xsl:for-each>

    <xsl:value-of select="number(true())"/>

      <xsl:text>&#x000A;</xsl:text>

    <xsl:value-of select="number(false())"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

NaN

21

NaN

1

0

★ 注意与说明 ★

1.当number()函数没有任何参数时,表示对上下文节点进行数值转换操作。

2.当number()函数的参数无法转换为数值型时,将返回NaN。

3.当number()函数的参数为boolean型时,true返回1,false返回0。

8.6.4  round()函数——四舍五入取整

语法:round(xpathExpression)

参数:xpathExpression,XPath表达式,必需

返回值:整数

用途:该函数用于将xpathExpression的值进行四舍五入取整。

以下示例程序演示了round()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<numbers>

  <number>41.2</number>

  <number>0.3</number>

  <number>-0.3</number>

  <number>-0.51</number>

  <number>number</number>

  <number>0</number>

</numbers>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="/numbers">

    <integers>

      <xsl:for-each select="number">

        <integer>

          <xsl:value-of select="round(.)"/>

        </integer>

      </xsl:for-each>

      <integer>

        <xsl:value-of select="round(true())"/>

      </integer>

      <integer>

        <xsl:value-of select="round(false())"/>

      </integer>

    </integers>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

<?xml version='1.0' encoding='ISO-8859-1' ?>

<integers>

  <integer>41</integer>

  <integer>0</integer>

  <integer>0</integer>

  <integer>-1</integer>

  <integer>NaN</integer>

  <integer>0</integer>

  <integer>1</integer>

  <integer>0</integer>

</integers>

★ 注意与说明 ★

1.round()函数不提供默认值,其参数为必选项。

2.当无法转换为数值型时,将返回NaN。例如,round("number")返回NaN。

3.对于布尔型,round(true())将返回1;round(false())将返回0。

8.6.5  sum()函数——求和

语法:sum(node-set)

参数:node-set,节点集合,必需

返回值:数值

用途:该函数用于计算节点集合node-set代表的数值之和。

以下示例程序演示了sum()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<employees>

  <employee id="001">

    <name>张俊</name>

    <salary>5450</salary>

  </employee>

  <employee id="002">

    <name>李军</name>

    <salary>5200</salary>

  </employee>

  <employee id="003">

    <name>汪峰</name>

    <salary>4000</salary>

  </employee>

  <employee id="004">

    <name>刘峰</name>

    <salary>3800</salary>

  </employee>

  <employee id="005">

    <name>周松</name>

    <salary>3700</salary>

  </employee>

</employees>

该文档存储了某公司员工工资情况。现在需要统计员工人数、员工总工资及人均工资,相应的XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/employees">

    共有员工:<xsl:value-of select="count(employee)"/>名

    全部工资:<xsl:value-of select="sum(employee/salary)"/>

    人均工资:<xsl:value-of select="sum(employee/salary) div count(employee)"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

共有员工:5名

全部工资:22150

人均工资:4430

8.7  XPath布尔型函数

布尔型函数,是指主要用于操作布尔型数据的函数。常用的布尔型函数包括boolean(),false(),lang(),not()和true()。本节将结合示例,对布尔型函数进行简单介绍。

8.7.1  boolean()函数——计算布尔值

语法:boolean(xpathExpression)

参数:xpathExpression,XPath表达式,必需

返回值:布尔值

用途:该函数用于将参数xpathExpression值转换为布尔型。

以下示例程序演示了boolean()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<example>

  <number>-1</number>

  <number>0</number>

  <number>0.1</number>

  <number>1</number>

  <number>2.1</number>

  <string>abcde</string>

  <string>12abcde</string>

</example>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/example">

    convert   -1   to boolean:<xsl:value-of select="boolean(-1)"/>

    convert    0   to boolean:<xsl:value-of select="boolean(0)"/>

    convert  0.1   to boolean:<xsl:value-of select="boolean(0.1)"/>

    convert  1.9   to boolean:<xsl:value-of select="boolean(1.9)"/>

    convert  ""    to boolean:<xsl:value-of select="boolean('')"/>

    convert  "0"   to boolean:<xsl:value-of select="boolean('0')"/>

    convert  "ab"  to boolean:<xsl:value-of select="boolean('ab')"/>

    节点number:<xsl:value-of select="boolean(number)"/>

    节点integer:<xsl:value-of  select="boolean(integer)"/>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

    convert   -1   to boolean:true

    convert    0   to boolean:false

    convert  0.1   to boolean:true

    convert  1.9   to boolean:true

    convert  ""    to boolean:false

    convert  "0"   to boolean:true

    convert "ab"    to boolean:true

    节点number:  true

    节点integer:  false

★ 注意与说明 ★

1.对于数值型,如果数值等于0,那么将boolean()函数将返回false;如果数值不等于0,那么将boolean()函数将返回true。

2.对于字符型,如果字符串为空(长度为0),那么将返回false;如果字符串不为空(长度大于0),boolean()函数将返回true。尤其注意,boolean(0)和boolean('0')的区别。

3.对于节点,如果节点存在,则返回true,否则将返回false。

8.7.2  false()函数——返回false

语法:false()

参数:无

返回值:布尔值false

用途:该函数用于返回布尔值“假”(false)。

8.7.3  lang()函数——判断xml:lang属性

语法:lang(string)

参数:string,字符串,必需

返回值:布尔值

用途:该函数用于返回上下文节点的xml:lang属性是否等于字符串string。

以下示例程序演示了lang()函数的用法。

XML源文档如下所示。

<?xml version="1.0"?>

<article>

  <title xml:lang="en">the article title</title>

  <para xml:lang="zh-cn">文章段落</para>

  <para xml:lang="FFFF">文章段落</para>

</article>

XSLT文档如下所示。

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/article">

    <xsl:apply-templates select="title"/>

    <xsl:apply-templates select="para"/>

  </xsl:template>

  <xsl:template match="title">

    <xsl:value-of select="lang('en')"/>

    <xsl:text>&#x000A;</xsl:text>

  </xsl:template>

  <xsl:template match="para">

    <xsl:value-of select="lang('FFFF')"/>

    <xsl:text>&#x000A;</xsl:text>

  </xsl:template>

</xsl:stylesheet>

输出结果如下所示。

true

false

true

★ 注意与说明 ★

1.如果上下文节点没有xml:lang属性,那么lang()将按照上下文节点的最近祖先节点的xml:lang属性进行判断;如果没有找到这样的xml:lang属性,那么lang()函数将返回false。

2.lang()不对上下文节点的文本内容进行判断,只是判断其xml:lang属性与指定的字符串是否相同。

3.lang()不对xml:lang属性的有效性进行检验,例如,上例中,FFFF不是合法的语言标识,但lang()函数仍然可以返回“真”。

4.lang()函数在比较时,不区分大小写。

8.7.4  not()函数——取反操作

语法:not(xpathExpressoin)

参数:xpathExpression,XPath表达式,必需

返回值:布尔值

用途:该函数用于返回XPath表达式的所代表的布尔值的相反值。

以下示例程序演示了not()函数的用法。

XML文档如下所示。

<?xml version="1.0"?>

<example>

  <number>-1</number>

  <number>0</number>

  <number>0.1</number>

  <number>1</number>

<