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节点且有值为v1v2的属性z1z2
  • x[i]指在兄弟节点中位于第i位的名为x的节点
  • x[@z="v"][i]x节点且其在兄弟节点中位于第i为且其z属性的值为v

还可以使用更简洁的语法:

  • x等价于//x(寻找任意深度的包含引用x的元素,引用是指th:refth: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" />

results matching ""

    No results matching ""