XPath

XPath即为XML路径语言（XML Path Language），它是一种用来确定XML文档中某部分位置的计算机语言。 XPath基于XML的树状结构，提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer（英语：XPointer）与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。 最常见的XPath表达式是路径表达式（XPath这一名称的另一来源）。路径表达式是从一个XML节点（当前的上下文节点）到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开，每一步有三个构成成分： 轴描述（用最直接的方式接近目标节点） 节点测试（用于筛选节点位置和名称） 节点描述（用于筛选节点的属性和子节点特征） 一般情况下，我们使用简写后的语法。虽然完整的轴描述是一种更加贴近人类语言，利用自然语言的单词和语法来书写的描述方式，但是相比之下也更加罗嗦。 最简单的XPath如下： /A/B/C 在这里选择所有符合规矩的C节点：C节点必须是B的子节点（B/C），同时B节点必须是A的子节点（A/B），而A是这个XML文档的根节点（/A）。此时的这种描述法类似于磁盘中文件的路径（URI），从盘符开始顺着一级一级的目录最终找到文件。 这里还有一个复杂一些的例子，包含了全部构成成分（请详细的看）： A//B/*[1] 此时选择的元素是：在B节点下的第一个节点（B/*[1]），不论节点的名称如何（*）；而B节点必须出现在A节点内，不论和A节点之间相隔几层节点（//B）；与此同时A节点还必须是当前节点的子节点（A，前边没有/）。 在未缩简语法里，两个上述范例可以写为： /child::A/child::B/child::C child::A/descendant-or-self::B/child::node()[1] 在XPath的每个步骤裡，通过完整的轴描述（例如：child或descendant-or-self）进行明确的指定，然后使用::，它的后面跟着节点测试的内容，例如上面范例所示的A以及node()。 轴描述元表示XML文件分支树表达式的浏览方向。这些坐标──包括全名及缩写语法──列举如下： 关于使用attribute坐标简写语法的一个范例，//a/@href在文件树里任何地方的元素下选择了一个叫href的属性。self坐标最通常与述语同用，以参考现行选定节点。例如，h3[.='See also']在现行上下文选取了叫h3的元素，该元素文字内容是See also。 如果需要了解更多，请查看ZVON.org给出的XPath帮助 （页面存档备份，存于互联网档案馆） 节点测试包括特定节点名或者更一般的表达式。至于XML里命名空间前缀gs已定义的文件，//gs:enquiry将找到所有在那命名空间里enquiry的节点。 其他节点格式： comment() 寻找XML注释节点，例如<!-- 注释 --> text() 寻找某点的文字型别，例如hello于<k>hello</k> processing-instruction() 寻找XML处理指令如<?php echo $a; ?>。在这个例子里，将符合processing-instruction('php')会传回值。 node() 寻找所有点 节点描述为一个逻辑真假表达式，任何真假判断表达式都可在节点后方括号里表示，这条件必须在XPath处理这个节点前先被满足。在某一步骤可有多少个描述并没有限制。 范例如下： //a[@href='help.php']，这将检查元素a有没有href属性，并且该它的值是help.php。 复杂一些的范例如下： //a[@href='help.php'][../div/@class='header']/@target 或 //a[@href='help.php'][name(..)='div'][../@class='header']/@target 此例将会选择符合条件的元素a的target属性。 要求元素a： 具有属性href且值为help.php； 并且元素a具有父元素div； 并且父元素（div）其自身具备class属性，值为header。 XPath 1.0定义四种数据型别：节点型（本身无序的节点组）、字符串型、数字型、与布尔型。 有效的运算符有： /、//以及..运算符，一般用于轴描述。 合集运算符 | 把两个节点形成联集。 布尔运算符and、or以及not()函数 数学运算符 +、-、*、div（除）以及mod（取余数） 比较操作子 =、!=（不等于）、<、>、<=、>= 函数有： 文字运算函数 concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length() 数学运算函数 sum(), round(), floor(), ceiling() 节点属性取得函数 name(), local-name(), namespace-uri() 处理上下文数据取得函数 position(), last() 类型转换函数 string(), number(), boolean() 某些常用的函式详列如下。完整明细请参照W3C建议书。 position() 返回当前节点集合内，该节点的位置。 count(node-set) 返回符合XPath的节点集合的节点总数。 string(object?) 根据内建法则转换任何四种XPath数据型别为字符串。参数可为XPath，此时符合条件的节点（群）被转换成字符串返回。 concat(string, string, string*) 链接任何数量的字符串。 contains(s1, s2) 如果s1包含s2返回真。 normalize-space(string?) 所有在字符串头和尾的空白字符都被移除，或者將字符间两个及以上的空白字符置换成单一空格。有些XML因打印关系被美化，但可能让后来的字符串处理結果不可靠，故使用此函式有时能很好地改善情况。 not(boolean) 布尔否运算函数。 sum(node-set) 根据内建转型规则，转换所有XPath参数定义找到的节点字符串值成为数字，然后返回这些数字总合 使用操作子：=, !=, <=, <, >=和>的表达式可以创造于术语内。布尔表达式可用括号()、布尔操作子and与or、和／或者上述的not()函式联合起来。数值计算使用*, +, -, div和mod。字符串可包含任何Unicode字符。 述语内外，整个节点组可利用"|"字符联合起来。 v[x or y] | w[z]会返回单一节点组，包括现行上下文找到的所有拥有x或y子元素的v元素、有z子元素的w元素。 //item[@price > 2*@discount]会选取price属性至少两倍于discount属性数值的对象 在W3C建议下，XPath 1.0于1999年11月16日发表。XPath 2.0于2007年1月23日成为W3C推荐标准。XPath 2.0表达了XPath语言在大小与能力上显著的增加。 最值得大书特书的改变是XPath 2.0有了更丰富的型别系统；XPath 2.0支持不可分割型态，如在XML Schema内建型态定义一样，并且也可自纲要（schema）导入用户自定型别。现在每个值都是一个序列（一个单一不可分割值或节点都被视为长度一的序列）。XPath 1.0节点组被节点序列取代，它可以是任何顺序。 为了支持更丰富的型别组，XPath 2.0提供相当延展的函式与操作子群。 XPath 2.0实际上是XQuery 1.0的子集合。它提供了一个for表达式。该式是XQuery里「FLWOR」表达式的缩减版。利用列出XQuery省去的部分来描述该语言是可能的。主要范例是查询前导语（query prolog）、元素和属性建构式、「FLWOR」语法的余项式、以及typeswitch表达式。 XPath 3.0於2014年4月8日成為W3C推薦標準，而XPath3.1則於2017年3月21日成為W3C推薦標準。 XML XSLT，XSL-FO XLink，XPointer XPointer Xquery XML Schema STXPath https://www.w3.org/TR/xpath-31/. Bergeron, Randy. XPath—Retrieving Nodes from an XML Document. SQL Server Magazine. October 31, 2000 [February 24, 2011]. （原始内容存档于July 26, 2010）.  Pierre Geneves. Course: The XPath Language (PDF). October 2012 [2021-03-15]. （原始内容 (PDF)存档于2021-04-14）.  XML and Semantic Web W3C Standards Timeline (PDF). 2012-02-04 [2021-03-15]. （原始内容 (PDF)存档于2013-04-24）.  W3C XPath1.0规范（英文） W3C XPath 2.0候选推荐（页面存档备份，存于互联网档案馆）（英文）