我在Spring Boot 1.3.5中挣扎,它依赖于旧的Thymeleaf 2.x系列,试图在标签内传递HTML模板script
:
<script type="text/template" id="catTmpl">
<![CDATA[
<b><%=name%></b>
]]>
</script>
导致错误:
org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
经过一些操作,它被正确传递但使用 CDATA 包装渲染,这破坏了 JS 模板(在我的情况下undescore.js
(:
_.template($("#catTmpl").html())
我看到一些博客,发现Thymleaf 3使用不同的解析器。检查:
$ gradle dependencies
| | +--- org.thymeleaf:thymeleaf:3.0.6.RELEASE
| | | +--- org.attoparser:attoparser:2.0.4.RELEASE
该解析器假定script
包含 CDATA,并且上面的代码在没有 CDATA 的情况下工作正常。
什么是attoparser
?
Thymeleaf 3 是否准备好通过script
(或 HTML 5template
(标签传递 HTML 模板,而不会胡说八道?
attoparser
http://www.attoparser.org/从项目主页:
- 易于使用。需要几行代码。再也不用担心 JDK 的解析器 API 版本了。
- 要快。与最快的标准解析器一样快。在许多情况下,速度更快。
- 提供强大的界面。考虑格式良好可选、行 + 列位置、重建原始文档的能力等。
- 简化您的解析体验。通过消除对验证或实体解析的担忧 - 在许多情况下两者都不需要。
正如邮件列表中所写attoparser
旨在与Thymeleaf合作。
它能够解析 HTML(因此无需关闭<p>
(,但正如这篇博文解析器所说,解析器接受无效的 HTML 5<div/>
。百里香叶 2 也接受这一点,但产生了有效的<div></div>
,百里香叶 3 不接受。小心!
根据错误修改方式被认为是 CDATA #9attoparser
script
正文解释为 CDATA,仅用于:
默认情况下,不应将所有这些替代项视为 CDATA(除非它们明确包含在 CDATA 部分中(,因此最好仅在以下有关类型的情况下考虑 CDATA 的内容:
- 无类型
- 类型是以下之一: JavaScript, ECMASCRIPT, text/JavaScript, text/ecmascript, application/javascript, application/ecmascript