Show Menu
主题×

HTL 表达式语言

HTML模板语言使用表达式语言访问提供HTML输出的动态元素的数据结构。 这些表达式由字符和
${
分隔
}
。 为避免格式错误的HTML,表达式只能用于属性值、元素内容或注释中。
<!-- ${component.path} --> <h1 class="${component.name}"> ${properties.jcr:title} </h1>
表达式可以由字符的前缀转义,
\
例如,将
\${test}
呈现
${test}
要试用本页中提供的示例,可以使用名为“读取评 估打印循环 ”的实时执行环境。
表达式语法包 括变量 文本 、运 算符和 选项 选项 :

变量

变量是存储数据值或对象的容器。 变量的名称称为标识符。
无需指定任何内容,HTL即可提供对JSP中在包含后通常可用的所有对象的访问
global.jsp
。 “全 局对象 ”页提供HTL提供访问的所有对象的列表。

属性访问

有两种方法可以访问变量的属性,包括点记号或括号记号:
${currentPage.title} ${currentPage['title']} or ${currentPage["title"]}
大多数情况下,最好使用更简单的点记号,并使用括号记号来访问包含无效标识符字符的属性或动态访问属性。 以下两章将详细介绍这两个案例。
访问的属性可以是函数,但是传递的参数不受支持,因此只能访问不期望参数的函数,如getter。 这是一个理想的限制,旨在减少嵌入到表达式中的逻辑量。 如果需要,
data-sly-use
可以使用语句将参数传递到逻辑。
上例中还显示了Java getter函数(如
getTitle()
,)的访问无需预定,
get
​并通过降低后面字符的大小写。

有效的标识符字符

变量名称(称为标识符)符合某些规则。 它们必须以字母(
A
-
Z
a
​和-
z
)或下划线(
_
)开头,后续字符也可以是数字(-
0
9
:
)或冒号()。 Unicode字母(如
å
和)
ü
不能用于标识符。
由于冒号(
:
)字符在AEM属性名称中很常见,因此它是有效的标识符字符很方便:
${properties.jcr:title}
括号记号可用于访问包含无效标识符字符的属性,如以下示例中的空格字符:
${properties['my property']}

动态访问成员

${properties[myVar]}

Null值的权限处理

${currentPage.lastModified.time.toString}

文字

文本是表示固定值的记号。

布尔型

Boolean表示逻辑实体,并可以具有两个值:
true
​和
false
${true} ${false}

数字

只有一个数字类型:正整数。 其他数字格式(如浮点)在变量中受支持,但不能表示为文本。
${42}

字符串

它们表示文本数据,可以是单引号或双引号:
${'foo'} ${"bar"}
除了普通字符外,还可以使用以下特殊字符:
  • \\
    反斜杠字符
  • \'
    单引号(或撇号)
  • \"
    双引号
  • \t
    表格化
  • \n
    新行
  • \r
    回车
  • \f
    表单源
  • \b
    Backspace
  • \uXXXX
    由四个十六进制数字XXXX指定的Unicode字符。 一些有用的Unicode转义序列包括:
    • \u0022
      for
      "
    • \u0027
      for
      '
对于上面未列出的字符,反斜杠字符前面将显示错误。
以下是如何使用字符串转义的一些示例:
<p>${'it\'s great, she said "yes!"'}</p> <p title="${'it\'s great, she said \u0022yes!\u0022'}">...</p>
这将导致以下输出,因为HTL将应用特定于上下文的转义:
<p>it&#39;s great, she said &#34;yes!&#34;</p> <p title="it&#39;s great, she said &#34;yes!&#34;">...</p>

阵列

数组是一组有序值,可以用名称和索引引用这些值。 其元素类型可以混合。
${[1,2,3,4]} ${myArray[2]}
数组可用于从模板中提供值列表。
<ul data-sly-list="${[1,2,3,4]}"> <li>${item}</li> </ul>

运营商

逻辑运算符

这些运算符通常与布尔值一起使用,但是,与JavaScript中一样,它们实际上返回指定操作数之一的值,因此与非布尔值一起使用时,它们可能返回非布尔值。
如果某个值可以转换
true
​为,则该值称为truthy。 如果某个值可以转换
false
​为,则该值称为falsy。 可转换为的值
false
有:未定义的变量、空值、数字零和空字符串。

逻辑非

${!myVar}
返回
false
其单个操作数是否可转换为
true
;否则,返回
true
例如,这可用于反转测试条件,如仅在没有子页面时显示元素:
<p data-sly-test="${!currentPage.hasChild}">current page has no children</p>

逻辑和

${varOne && varTwo}
varOne
果是虚假的,则返回;否则,返回
varTwo
此运算符可用于同时测试两个条件,如验证两个属性的存在:
<div data-sly-test="${properties.jcr:title && properties.jcr:description}"> <h1>${properties.jcr:title}</h1> <p>${properties.jcr:description}</p> </div>
逻辑AND运算符还可用于有条件地显示HTML属性,因为HTL删除了值动态设置为false或空字符串的属性。 因此,在以下示例中,仅当属
class
性是真实的并且存在且不
logic.showClass
logic.className
为空时,才显示该属性:
<div class="${logic.showClass && logic.className}">...</div>

逻辑或

${varOne || varTwo}
果varOne
真实,则返回varOne;否则,返回
varTwo
此运算符可用于测试是否适用以下两种条件之一,如验证是否存在至少一个属性:
<div data-sly-test="${properties.jcr:title || properties.jcr:description}">...</div>
由于逻辑OR运算符返回第一个真实的变量,因此它还可以非常方便地用于提供回退值。
有条件地显示HTML属性,因为HTL删除了由计算结果为false或空字符串的表达式设置的值的属性。 因此,如果标题存在且
properties.jcr:
properties.jcr:description
不为空,则以下示例将显示标题;如果标题存在且不为空,则它将返回显示,否则将显示消息“未提供标题或说明”:
<p>${properties.jcr:title || properties.jcr:description || "no title or description provided"}</p>

条件(三元)运算符

${varCondition ? varOne : varTwo}
varOne
果真
varCondition
实,则回报;否则,它会返回
varTwo
此运算符通常可用于定义表达式中的条件,如根据页面状态显示不同的消息:
<p>${currentPage.isLocked ? "page is locked" : "page can be edited"}</p>
一个重要的注意事项是,由于标识符中也允许冒号字符,所以最好用空白分隔三元运算符以为分析器提供清晰度:
<p>${properties.showDescription ? properties.jcr:description : properties.jcr:title}</p>

比较运算符

等式和不等式运算符仅支持相同类型的操作数。 当类型不匹配时,将显示错误。
  • 如果字符串具有相同的字符序列,则字符串相等。
  • 数值相同时,数字相等
  • 如果两者均为或两者均
    true
    为,则布尔值相
    false
    ​等。
  • 空变量或未定义的变量彼此相等。
${varOne == varTwo}
true
varOne
相等
varTwo
时返回。
${varOne != varTwo}
true
varOne
不相
varTwo
等时返回。
关系运算符仅支持数字操作数。 对于所有其他类型,都会显示错误。
${varOne > varTwo}
返回
true
值(
varOne
如果大于)
varTwo
${varOne < varTwo}
返回
true
值(
varOne
如果小于)
varTwo
${varOne >= varTwo}
返回
true
值(
varOne
如果大于或等于)
varTwo
${varOne <= varTwo}
返回
true
值(
varOne
如果小于或等于)
varTwo

分组括号

分组运算符控
(
制表达式
)
中评估的优先级。
${varOne && (varTwo || varThree)}

选项

表达式选项可以对表达式执行操作并修改它,或者与块语句一起使用时用作参数。
之后的一切
@
都是一个选项:
${myVar @ optOne}
选项可以有一个值,它可以是变量或文本:
${myVar @ optOne=someVar} ${myVar @ optOne='bar'} ${myVar @ optOne=10} ${myVar @ optOne=true}
多个选项之间用逗号分隔:
${myVar @ optOne, optTwo=bar}
也可以使用仅包含选项的参数表达式:
${@ optOne, optTwo=bar}

字符串格式

用相应的变量替换枚举的占位符{
n
}的选项:
${'Page {0} of {1}' @ format=[current, total]}

国际化

使用当前词典将字符串转换为当
前源
(请参阅下文)的语 。 如果未找到转换,则使用原始字符串。
${'Page' @ i18n}
提示选项可用于为翻译人员提供注释,指定使用文本的上下文:
${'Page' @ i18n, hint='Translation Hint'}
语言的默认源为“resource”,这意味着文本将翻译为与内容相同的语言。 这可以更改为“user”,这意味着该语言是从浏览器区域设置或登录用户的区域设置中获取的:
${'Page' @ i18n, source='user'}
提供显式区域设置将覆盖源设置:
${'Page' @ i18n, locale='en-US'}
要将变量嵌入到已翻译的字符串中,可以使用格式选项:
${'Page {0} of {1}' @ i18n, format=[current, total]}

阵列连接

默认情况下,将数组显示为文本时,HTL将显示以逗号分隔的值(无间距)。
使用连接选项指定不同的分隔符:
${['one', 'two'] @ join='; '}

显示上下文

HTL表达式的显示上下文指其在HTML页结构中的位置。 例如,如果表达式出现在表示文本节点后会生成该节点的位置,则表示它位于上下文
text
中。 如果在某个属性的值中找到它,则它被认为位于上
attribute
下文中,依此类推。
除脚本(JS)和样式(CSS)上下文外,HTL将自动检测表达式的上下文并相应地转义它们,以防止XSS安全问题。 对于脚本和CSS,必须显式设置所需的上下文行为。 此外,在需要覆盖自动行为的任何其他情况下,也可以显式设置上下文行为。
这里,我们在三个不同的上下文中有三个变量:
properties.link
(上
uri
下文)、
properties.title
(上下文)
attribute
和(上
properties.text
text
下文)。 HTL将根据其各自上下文的安全要求以不同方式逃避这些漏洞。 通常情况下,如下情况,不需要显式上下文设置:
<a href="${properties.link}" title="${properties.title}">${properties.text}</a>
要安全地输出标记(即,表达式本身的计算结果为HTML),请使用
html
上下文:
<div>${properties.richText @ context='html'}</div>
必须为样式上下文设置显式上下文:
<span style="color: ${properties.color @ context='styleToken'};">...</span>
必须为脚本上下文设置显式上下文:
<span onclick="${properties.function @ context='scriptToken'}();">...</span>
还可以关闭逃生和XSS保护:
<div>${myScript @ context='unsafe'}</div>

上下文设置

上下文
何时使用
它的用途
文本
元素内容的默认值
编码所有HTML特殊字符。
html
安全输出标记
过滤HTML以符合AntiSamy策略规则,删除与规则不符的内容。
属性
属性值的默认值
编码所有HTML特殊字符。
uri
显示链接和路径href和src属性值的默认值
验证URI以编写为href或src属性值,如果验证失败,则不输出任何内容。
数字
要显示编号,请执行以下操作:
验证URI是否包含整数,如果验证失败,则输出零。
attributeName
在设置属性名称时,data-sly-attribute的默认值
验证属性名称,如果验证失败,则不输出任何内容。
elementName
数据密钥元素的默认值
验证元素名称,如果验证失败,则不输出任何内容。
scriptToken
对于JS标识符、文本数字或文本字符串
验证JavaScript令牌,如果验证失败,则不输出任何内容。
scriptString
在JS字符串中
对字符串中分开的字符进行编码。
scriptComment
在JS注释中
验证JavaScript注释,如果验证失败,则不输出任何内容。
styleToken
用于CSS标识符、数字、尺寸、字符串、十六进制颜色或函数。
验证CSS令牌,如果验证失败,则不输出任何内容。
styleString
在CSS字符串中
对字符串中分开的字符进行编码。
styleComment
在CSS注释中
验证CSS注释,如果验证失败,则不输出任何内容。
不安全
只有上述情况都不适用
完全禁用逃逸和XSS保护。