XPath/CSS 等效
:disabled 等效
//*[@disabled]
代表 :disabled
:checked 等效
//*[@checked]
代表 :checked
:selected 等效
//*[@selected]
代表 :selected
:text 等效
//*[@type="text"]
代表 :text
:contains 等效
//*[contains(text(),"you")]
代表 :contains("you")
:only-of-type 查询
//p[contains(@me,"you")]
代表 p[me*="you"]
以...开头等效
//p[starts-with(@me,"you")]
代表 p[me^="you"]
包含等效
//p[starts-with(@me,concat("you",'-'))]
代表 p[me|="you"]
以...结尾等效
//p[substring(@me,string-length(@me)-2)="you"]
代表 p[me$="you"]
像等效
//p[contains(concat(" ",@me, " ")," you ")]
代表 p[me~="you"]
否定属性等效
//p[@me!="you"]
代表 p[me!="you"]
ID 等效
//p[@id="me"]
代表 p#me
:not 等效
//p[not(@id="me")]
代表 p:not(#me)
类等效
//p[contains(concat(" ", @class, " "), " me ")]
代表 p.me
后代等效
//div//p
代表 div p
子节点等效
//div/p
代表 div > p
相邻兄弟节点等效
//h1/following-sibling::div
代表 h1 + div
一般兄弟节点等效
//h1/following-sibling::*[count(div)]
代表 h1 ~ div
:nth-last-child(n) 查询
//*[count(child::node() ) > 0]
代表 hasChildNodes
:root 查询
/*[1]
代表 :root
:first-child 查询
descendant::*[1]
代表 :first-child
:last-child 查询
//*[last()]
代表 :last-child
:nth-last-child(n) 查询
//*[count(*)=1]
代表 :only-child
:empty 查询
//*[count(*) = 0]
代表 :empty
:nth-child(n) 查询
//*[position() mod n = 1]
代表 :nth-child(n)
:nth-child(odd) 查询
//*[(position() mod 2)=1]
代表 :nth-child(odd)
:nth-child(even) 查询
//*[(position() mod 2)=0]
代表 :nth-child(even)
:nth-last-child(n) 查询
//*[(count() - position()) mod n = 1]
代表 :nth-last-child(n)
:nth-of-type(n) 查询
//p[n]
代表 :nth-of-type(n)
:nth-last-of-type(n) 查询
//p[(count() - position()) mod n = 1]
代表 :nth-last-of-type(n)
:first-of-type 查询
descendant::p[1]
代表 :first-of-type
:last-of-type 查询
//p[last()]
代表 :last-of-type
:only-of-type 查询
//p[count(*)=1]
代表 :only-of-type
-moz-any/-webkit-any 查询
[local-name()='h1' or local-name()='h4']/node()
代表 -moz-any(h1,h4) *
//mytag
代表 getElementsByTagName
//*[@class=$myclass]
代表 getElementsByClassName
//*
代表 childNodes
preceding-sibling::*[1]
代表 previousSibling
following-sibling::*[1]
代表 nextSibling
./following-sibling::*
代表 generalSibling
- 谓词就像 SQL 的 where 子句
- 管道就像 SQL 的 union 子句
- 轴就像 SQL 的 t1.col = t2.col
- 使用带有布尔变量检查的谓词作为 if 语句
- 使用带有标签名搜索的管道作为范围检查器
//h2 | //h3 | //h4
- 使用带有否定谓词变量检查的管道作为 else 语句
//var[1] | //var[not //var]
- 使用重复轴跳过树中的级别,以检索每隔分支的节点
child::*/child::*
- 使用变量在复杂和/或条件测试中存储单个检查
- 在循环中使用变量来存储依赖于迭代的变量,并将逻辑与输出分离
- 使用 string-length 测试函数的存在
- 使用单独的测试,例如 (a and c) 或 (b and c),而不是嵌套条件,例如 ((a or b) and c)
- 使用 string(.), local-name(.),string-length(concat(., '') ), number(.), 和 boolean(.)[boolean(.)] 测试节点值、名称和存在
- 使用 //node()[local-name(.) = $myvar] 测试表单值是否存在
- 使用 //node()[local-name(.) = $myvar][boolean(node())] 跳过空表单值
- 调试时始终跳过空节点
- 使用 local-name(.)[boolean(.)] 测试上下文节点中是否存在空标签
- 使用 boolean(@*[not aa or not bb]) 过滤已知属性
- 使用 {boolean((string$myvar))} 测试插值变量
- 使用 boolean(following::*[1] or following::. or following::self::*) 测试结束标签失败
- 使用 count(//*[1 | last() = 1]) 统计只有一个子节点的节点
- 使用 (table1 | table2)[col=val]/* 进行连接
- 使用 *[not(@*)] 返回没有属性的节点
- 使用 number(.) - number(.) 抑制数值
- 使用 substring(., 0, string-length(.) ) 抑制字符串值
- 使用 substring('0', 1, not($myvar) ) 将未定义的变量设置为零
- 使用 normalize-whitespace($myvar) 删除列表中的制表符
- 使用 translate($myvar, $ABCvar, $abcvar) 以及存储 A-Z 和 a-z 的变量,以忽略节点查询的大小写
- 在检查列表位置时使用 string-length 而不是 contains,使逻辑数据独立
- 使用 use-attribute-sets 与多个元素共享样板参数,例如表格或列表行
- 在选择时使用 * 或 self::* 以返回节点集或单个节点
- 使用 string(.) 从使用 document 函数调用的 XML 文件中获取节点
- 在每个列表项之间使用不同的分隔符,使 substring-before/after 逻辑更易读
- 使用节点/类名与计数器/节点值的字符串连接来生成 ID 属性
- 使用变量存储上一个索引值,并使用逗号使 substring-after 能够与递归一起使用
- 使用带有节点布尔值的谓词作为保护运算符
smyvar[$myvar]
- 使用 XSL 节点存储本地值,并使用管道在谓词中测试 XML 节点,以模拟默认运算符 $dynamic[$var] | $default[not($var)]
- 使用子节点轴代替斜杠来对子节点进行分组
child::(boy | girl)
- 避免使用 (*),因为它在测试子节点之前会遍历树
- 使用 node() 而不是 .,当使用 // 搜索所有元素时
- 使用节点本身的 generate-id 的谓词检查和节点变量执行交集和排除集运算
- 使用 concat 连接节点和虚拟参数,以检查节点是否存在
- 使用 string(number(.))=NaN 检查数值节点值是否存在
- 在比较包含多个节点的变量时,使用 not($a=$b) 而不是 $a !=$b
- 在括号之后使用换行符,避免留下一个未结束的括号
- 使用谓词检查表单字段名是否在 XML 文档中存在
- 使用 qname 获取标签的命名空间绑定
- 使用 id() 获取 generate-id 值,而不是变量插值