Thymeleaf 的标记选择器直接使用了 Thymeleaf 引入的 attparser 解析库。
这个选择器的语法与 XPath、CSS 和 jQuery 中的选择器有很大的相似之处,这使得大多数用户都很容易使用。您可以在 attparser 文档中查看完整的语法参考。
例如,下面的选择器将在标记内的每个位置选择包含 class='content' 的 <div> 元素:
<div th:insert="mytemplate :: //div[@class='content']">...</div>
基本语法包括:
/x 表示当前节点的直接子节点,名称为 x
//x 表示当前节点在任何深度上的子节点,名称为 x。
x[@z="v"] 表示名称为 x 的元素,且有一个名为 z 的属性,其值为 "v"。
x[@z1="v1" and @z2="v2"] 表示名称为 x 的元素,以及 z1 和 z2 属性的值分别为 “v1” 和 “v2”。
x[i] 表示名称为 x 的元素,位于其同级元素中编号为 i 的元素。
x[@z="v"][i] 指名称为 x,属性为 "v" 的元素,并在其同级别的元素中编号为 i。
但也可以使用更简洁的语法:
x 完全等同于 //x(在任何深度层次上搜索一个具有名称或引用 x 的元素,引用是指 th:ref 或 th:fragment 属性)。
选择器也允许没有元素名称/引用,只要它们包括一个参数说明。因此,[@class='oneclass'] 是一个有效的选择器,它寻找任何具有 "oneclass" 值的 class 属性的元素(标签)。
高级属性选择功能:
除了 =(相等),其他的比较运算符也是有效的:!=(不相等),^=(开始)和 $=(结束)。例如:x[@class^='section'] 意味着名称为 x 的元素和以 section开头的属性 class 值。
属性可以以 @ 开头(XPath风格),也可以不以 @ 开头(jQuery风格)。所以 x[z='v'] 等同于 x[@z='v']。
多个属性的修饰符既可以用和(XPath风格)连接,也可以用链式的多个修饰符(jQuery风格)连接。所以 x[@z1='v1' and @z2='v2'] 实际上等同于 x[@z1='v1'][@z2='v2'] (也等同于 x[z1='v1'][z2='v2'])。
类似jQuery的直接选择器:
x.oneclass 相当于 x[class='oneclass']
.oneclass 相当于 [class='oneclass']
x#oneid 相当于 x[id='oneid']
#oneid 相当于 [id='oneid']
x%oneref 表示具有 th:ref="oneref" 或 th:fragment="oneref" 属性的 <x> 标记。
%oneref 指任何具有 th:ref="oneref" 或 th:fragment="oneref" 属性的标签。注意这实际上等同于简单的 oneref,因为可以用引用来代替元素名。
直接选择器和属性选择器可以混合使用:a.external[@href^='https']
因此,上面的标记选择器表达式:
<div th:insert="mytemplate :: //div[@class='content']">...</div>
可以写成:
<div th:insert="mytemplate :: div.content">...</div>
查看另一个示例,如下所示:
<div th:replace="mytemplate :: myfrag">...</div>
将寻找 th:fragment="myfrag" 片段签名(或 th:ref 引用)。但也会寻找名称为 myfrag 的标签,如果它们存在的话(在 HTML 中,它们并不存在)。请注意与下面区分:
<div th:replace="mytemplate :: .myfrag">...</div>
上面实际上会寻找任何带有 class="myfrag" 的元素,而不关心 th:fragment 签名(或 th:ref 引用)。
标记选择器理解类属性是多值的,因此允许在这个属性上应用选择器,即使该元素有几个类值。
例如,div.two 将匹配 <div class="one two three" />。