XPath

来自百合仙子's Wiki
跳转到导航 跳转到搜索

示例

.
当前节点
..
父节点
text()
节点内的所有文本节点[1]
a/@href
节点的指定属性值
//a[not(starts-with(@href,"mailto:"))]
所有href属性不以mailto:开头的<a>标签
//a/sup/parent::a
选取父节点:所有含有子节点 sup 的 a 节点
//tr[count(td)=2]
包含两个节点的节点[2]
a[contains(concat(' ', normalize-space(@class), ' '), ' b ')]
等价于 CSS 中的类选择器
//a[@rel="next"]/preceding-sibling::a[1]/text()
指定节点的前一个姊妹节点的文本
//p/following-sibling::br
跟着 p 节点的 br 节点

浏览器中使用

// ==UserScript==
// @name           Wikipedia 语言链接顺序调整
// @description    将维基百科中的中英文语言链接放到最前面
// @namespace      https://blog.lilydjwg.me/
// @include        https://*.wikipedia.org/*
// @include        https://*.wiktionary.org/*
// ==/UserScript==
 
var links = document.evaluate('//*[@id="p-lang"]//a[text()="中文" or text()="English"]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var ul;
for(var i=0, len=links.snapshotLength; i<len; i++){
  var link = links.snapshotItem(i);
  ul = ul || link.parentNode.parentNode;
  ul.insertBefore(link.parentNode, ul.firstChild);
}

[3] [4]

关于document.evaluate的参数,参见Introduction to using XPath in JavaScript | MDN

参考资料