20.附录C Markup选择器语法
thymeleaf的markup选择器直接借用于Thymeleaf的解析库:AttoParser
该选择器的语法和XPath,CSS和jQuery的选择器非常相似,对于大多数用户来说易于使用。你可以看一下AttoParser文档中完整的语法介绍。
比如,下面的选择器会选中markup中所有class值包含content的<div>标签(注意这并不是很简洁,继续阅读来了解原因):
<div th:insert="mytemplate :: //div[@class='content']">...</div>
基本的语法包括:
/x指当前节点下名为x的直接子节点//x指当前节点下名为x的任何深度的子节点x[@z="v"]指x节点且有值为"v"的z属性x[@z1="v1" and @z2="v2"]指x节点且有值为v1和v2的属性z1和z2x[i]指在兄弟节点中位于第i位的名为x的节点x[@z="v"][i]值x节点且其在兄弟节点中位于第i为且其z属性的值为v
还可以使用更简洁的语法:
x等价于//x(寻找任意深度的包含引用x的元素,引用是指th:ref或th:fragment属性的值)- 选择器也可以没有元素名称/引用,只指定其参数。因此
[@class='oneclass']是一个合法的选择器,它查找任何class值包含“oneclass”的元素(标签)。
高级属性选择功能:
- 除了
=(相等),其它的比较也是合法的:!=(不等),^=(以...开头) 和$=(以...结尾)。比如,x[@class^='section']指元素x且其class属性有一个值的开头为section。 - 属性可以用
@指定(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']
所以上面的markup选择表达式:
<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)。
多类匹配
markup选择器知道类属性可以为多个值,因此允许选择器作用于有多个值的class属性。
比如div.two可以匹配<div class="one two three" />