Thymeleaf 教程

标记选择器语法

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 引用)。

多值 class 匹配

标记选择器理解类属性是多值的,因此允许在这个属性上应用选择器,即使该元素有几个类值。

例如,div.two 将匹配 <div class="one two three" />。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号