xpath

xpth

Posted by nomadli on February 5, 2021

节点选取

  • nodename 选取此节点的所有子节点。 如packag 选取packag元素的所有子节点。
  • / 从根节点选取。 如 /a 选取根元素a /a/b 选取根元素a下的b
  • // 选择当前节点下匹配的所有节点, //a 选取所有a子元素 a//b a下所有b
  • . 选取当前节点。
  • .. 选取当前节点的父节点。
  • :: 与当前节点的关系
  • @ 选取属性 如 //@name 选取名为name的所有属性
          ancestor::img                           父节点中的img节点
          ancestor-or-self::img                   当前及父节点中的img节点
          attribute::ref                          当前的ref属性
          child::*[name()!='xx']                  子节点中名字不是xx的
          descendant::*[name()!='xx']             子孙节点中名字不是xx的
          descendant-or-self::*[name()!='xx']     当前及子孙节点中名字不是xx的
          following::*                            当前节点之后的所有节点
          following-sibling::                     当前节点之后的同级的其它节点
          preceding::*                            当前节点之前的所有节点
          preceding-sibling::*                    当前节点之前的同级的其它节点
          namespace::*                            当前节点的所有命名空间节点
          parent::                                父节节点 === ..
          self::                                  当前节点 === .
    

节点过滤

  • []中括号表示条件
  • /a/b[1] 选取属于a子元素的第一个b元素。
  • /a/b[last()] 选取属于a子元素的最后一个b元素。
  • /a/b[last()-1] 选取属于a子元素的倒数第二个b元素。
  • /a/b[position()<3] 选取最前面的两个属于a元素的子元素的b元素。
  • //title[@lang] 选取所有拥有名为lang的属性的title元素。
  • //title[@lang=’eng’] 选取所有title元素且这些元素拥有值为eng的lang属性。
  • /a/b[price>35.00] 选取a元素的所有b元素,且其中的price元素的值须大于35.00。
  • /a/b[price>35.00]//c 选取a素中的b元素的所有c元素,且其中的price元素的值须大于35.00。
          + - * div mod                           四则运算
          = != > >= < <=                          比较运算
          and or                                  组合运算
          position()                              当前节点序号从1开始计数
          last()                                  最后一个节点序号
          name()                                  当前节点名字
          fn:number(xx)                           返xx的数值, number('100')=100
          fn:abs(num)                             绝对值
          fn:ceiling(num)                         大于num的最小整数, ceiling(3.14) = 4
          fn:floor(num)                           不大于num的最大整数, floor(3.14) = 3
          fn:round(num)                           四舍五入为最接近的整数
          fn:round-half-to-even()                 四舍五入为偶数?
          fn:string(arg)                          返回字符串值, string(314) = "314"
          fn:codepoints-to-string(x,y,...)        unicode转字符串
          fn:string-to-codepoints(str)            字符串转unicode
          fn:codepoint-equal(x,y)                 字符串的unicode是否相等
          fn:compare(x,y,[collation])             字符串比较 == strcmp, 可以对比规则url
          fn:concat(x,y,...)                      字符串拼接 == strcat
          fn:string-join((x,y,...),[sep])         通过sep拼接字符串, sep 默认为空
          fn:substring(x,start,[len])             子字符串
          fn:string-length([str])                 返回str长度, 无参数返回当前节点字符串长度
          fn:normalize-space([str])               删除字符串的开头和结尾的空白, 无参数当前节点字符串
          fn:normalize-unicode()                  字符串转unicode编码
          fn:upper-case(str)                      转换为大写
          fn:lower-case(str)                      转换为小写
          fn:translate(x,y,z)                     把x中的y替换为z
          fn:escape-uri(url,esc|res)              URL编码, true esc 转换path部分, false res只转换参数
          fn:contains(x,y)                        x包含y返回true
          fn:starts-with(x,y)                     如果x以y开始返回true
          fn:ends-with(x,y)                       如果x以y结尾返回true
          fn:substring-before(x,y)                返回x中y出现之前的子字符串
          fn:substring-after(x,y)                 返回x中y出现之后的子字符串
          fn:matches(x,pattern)                   匹配指定的正则返回true
          fn:replace(x,pattern,replace)           正则替换
          fn:tokenize(x,pattern)                  返回正则匹配的子串数组
          fn:boolean(arg)                         转为true false
          fn:not(arg)                             转为true false 并取反
          fn:true()                               true
          fn:false()                              false
          fn:index-of((x,y,...),z)                返回z在数组中出现的位置数组,位置从1开始
          fn:remove((x,y,...),z)                  删除数组中的z位置的数据,返回新数组
          fn:empty(x,y,...)                       数组是否为空
          fn:exists(x,y,...)                      数组是否为空
          fn:distinct-values((x,y,...),[z])       去重, z为判断函数?
          fn:insert-before((x,y,...),pos,z)       在数组pos位置前插入z
          fn:reverse((x,y,...))                   倒序数组
          fn:subsequence((x,y,...),start,len)     返回start开始len长度的数组
          fn:unordered((x,y,...))
    

通配选取

  • /bookstore/* 选取bookstore元素的所有子元素。
  • //* 选取文档中的所有元素。
  • //title[@*] 选取所有带有属性的title元素。
  • node() 匹配任何类型的节点。

多条件

  • //a/b //a/c 选取a元素的所有b和c元素。
  • //title //price 选取文档中的所有title和price元素。
  • /a/b/c //price 选取属于a元素的b元素的所有c元素,以及文档中所有的price元素。