XPath概述:
    XPath是由W3C指定的,是在XML文档中进行寻址的表达式语言,它能够通过一个通用的句法和语义对XML文档中的节点进行检索和定位。
    内容包括三个部分:
    XPath使用路径表达式在XML文档中进行导航;
    XPath包含一个标准函数库;
    XPath是XSLT中的主要元素。
    XPath版本:
    XPath1.0是1999年成为W3C标准
    XPath2.0是2007年确立的
    XPath3.0是2014年确立的
    XPath的节点:
    XPath将XML文档看作是一个节点树模型。
    节点类型:
    根结点:XML文档的根成为文档节点或根节点
    元素节点:一个元素的开始标签、结束标签,以及开始标签和结束标签之间的全部内容整体称为元素节点;元素节点可以包含的子节点有元素节点、属性节点、处理指令节点,以及该元素节点对应其文本内容的文本节点。一个元素节点的字符值使其本身包含的文本内容,或者是所有其子孙元素节点的文本值的串联。
    属性节点:元素的每个属性都是属性节点。属性节点包括属性名和属性值两个部分;包含它的元素节点是该属性节点的父节点,但是他不是其父元素节点的子节点;如果一个元素节点与另一个元素节点不相同,那么他们的属性节点肯定不相同。
    文本节点:所有的字符数据,包括CDATA段的字符数据;文本节点只有一个父节点,而且不会有任何的子节点和兄弟节点。
    命名空间:命名空间代表XML文档中的xmlns:prefix属性
    处理指令:XML文档的处理指令
    注释:
    根节点
    根节点就是节点数的根,用“/”来表示。即文档中的所有节点(包括处理指令节点、根元素节点等)都是根节点的子孙节点。文档根元素节点是根节点的子节点。
    根节点与文档文档根元素节点是不同的,文档根元素节点是XML文档的第一个顶层元素对应的元素节点。
    节点集对象
    一个节点集是一组节点的无序组合,它是XPath表达式运算的直接结果。节点集能够包含来自任意七种不同类型的节点。
    节点集中每一个节点都被认为是集合中其他节点的兄弟节点。如果节点集中的节点包含子节点,这些子节点并不是节点集的一部分。
    XPath路径
    XPath路径包括一个或多个Step组成,Step常被翻译成步或步骤。不同Step之间使用“/”分割。
    举例:/child::root/child::id[text()=100]中包含了两个步,在实际应用中经常使用简化后的语法:/root/child[text()=100]。
    Step
    XPath中Step的语法如下所示:
    轴::节点测试[限定谓语]
    参数声明:
    轴:用于定义当前节点与所选节点的关系
    节点测试:用于指定轴内部的部分节点
    限定谓语:零个或零个以上的判断语句,使用专用的表达式对轴和节点测试匹配的节点做进一步限定
    举例:child::id[text()=100],在这个语句中进行了3次筛选,每一次筛选都是在上一次筛选的结果节点集的基础上进行下一步筛选。(1)child是轴,该轴表示当前路径的子节点集;(2)id表示从子节点集中筛选所有元素名称为id的子节点集;(3)谓词[text()=100]表示从中进一步筛选id值为100的子节点集。

    在一个定位路径中轴是一种相互关系,是定位步长本身与上下文节点之间的关系。
    self轴返回上下文节点本身,则self轴返回的节点集只有自身节点一个,在使用时要注意。如果当前上下文节点的的节点名为nodename,只有self::nodename才会返回节点,否则该轴返回的值为空。
    XPath的轴及其含义:image.png
    定位步长的默认轴就是child轴。
    轴关系展示图:
    image.png
    节点测试
    XPath支持的节点测试语法,能够对轴索筛选出来的结果集做进一步过滤,具体常用的语法包括:
    1.nodename:从指定轴匹配的所有节点中选出名称为nodename的节点
    2.node():选择与之匹配的所有类型的节点
    3.text():选择指定轴匹配的所有文本类型的节点
    4.comment():选择指定轴匹配的所有注释节点
    5.processing-instruction():选择与指定轴匹配的所有处理指定节点。
    6.:通配符,不对指定轴进行任何过滤获取所有的元素节点及文本节点。
    是node()的子集=元素节点+文本节点
    谓词
    谓词在步的语法中放在中括号中,一个步中可以包含零个或多个谓词。
    谓词本身是一个布尔类型表达式
    例如:child::id[text()=100]中包含了一个谓词,表达的含义是过滤出文本内容等于100的值。
    简化路径 慎用 需要用对
    简化路径其实就是把规范路径当中轴书写采用的特殊符号进行了替换。
    替换的内容主要包括:
    child::可省略
    parent::简化为..
    descendant-or-self::简化为//
    self::简化为.
    Attribute::简化为@
    [position()=1]简化为[1]
    练习
    image.png
    (1)/child::root/child::id[position()=2]
    (2)/child::root/child::name
    (3)/child::root/child::id[position()<=2]
    (4)/descedant-or-self::id
    (5)/child::root/child::node()
    XPath函数
    XPath1.0中共包含27个函数,根据函数传入的参数可以分为4类:
    节点集函数库
    布尔函数库
    数字函数库
    字符串函数库
    节点集函数库包含的函数如下所示:
    last():返回当前选中节点集的最后一个节点的位置,是一个数字;
    position():返回当前正在处理的节点处于选中的节点集的位置,是一个数字;
    count(ns):返回当前选中的节点集的节点数量;
    local-name(ns?):返回传入节点的本地部分;
    namespace-uri(ns?):返回传入节点的命名空间部分URI部分;
    name(ns?):返回传入节点的完整扩展名称,如果有命名空间则包括命名空间URI部分。
    布尔函数库介绍具体包含的函数如下:
    boolean(obj):用于测试参数“obj”是否存在。如果obj指定的是一个节点集,当且仅当指定节点集不为空时返回的结果才是真。如果是一个字符串,当且仅当字符串长度大于零时返回值才是真。如果是一个数字,当且仅当数字大于零时才返回真。否则返回的结果为假。
    not(boolean):对参数取反,即传入真时为假,当传入假时函数返回值为真。
    true():简单的返回true;
    false():简单的返回false;
    lang(str):返回值为布尔值,根据上下文节点是否有xml:lang属性,且它的值是否等于“str”指定的。如果有且相等,则返回true。
    数字函数库具体包含的函数如下:
    number(obj):将一个对象转换为数字
    sum(ns?):把传入的节点集中每一个节点转换为数字并求和
    floor(num):利用截断的原则取整的函数
    ceiling(num):利用进一步法的原则取整的函数
    round(num):返回四舍五入的原则取整的函数
    字符串函数组介绍:
    string(any):以XPath中的四种类型对象为参数,并将其转换为一个字符串;
    concat(atring,string,…):传入参数为字符串或模式表达式,返回由两个或更多字符串组成的字符串;
    substring(string,number,number?):返回指定位置的子串
    contains():检查字符串中是否包含另外一个字符串
    通过绝对路径寻址节点:
    斜线“/”代表根节点,绝对路径总是从根节点开始。
    例如:/book/preface
    通过上下文节点寻址:
    不以“/”开头,代表了目标节点与上下文节点的相对位置关系。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <?xml stylesheet t>ype="text/xsl" href="xslDemo.xsl"?>
    3. <!--个人信息-->
    4. <person id="2018212222" xmlns="http://www.china.person/dalian">
    5. <name>张三</name>
    6. <birthday>2011-08-01</birthday>
    7. <sex></sex>
    8. <high>180cm</high>
    9. </person>

    回答以下XPath的含义:
    person
    /person
    /person/name
    //sex
    //@id