XSLT 视图
XSLT(可扩展样式表转换语言)是一种用于 XML 的转换语言,在 Web 应用程序中作为视图技术非常流行。如果你的应用程序天然处理 XML,或者你的模型可以轻松转换为 XML,那么 XSLT 是一个不错的选择。
本节展示了如何生成 XML 文档作为模型数据,并在 Spring Web MVC 应用程序中使用 XSLT 进行转换。
Bean 配置
配置对于简单的 Spring Web 应用程序是标准的:MVC 配置必须定义一个 XsltViewResolver Bean。
java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Bean
public XsltViewResolver xsltViewResolver() {
XsltViewResolver viewResolver = new XsltViewResolver();
viewResolver.setPrefix("/WEB-INF/xsl/");
viewResolver.setSuffix(".xslt");
return viewResolver;
}
}kotlin
@Configuration
class WebConfiguration : WebMvcConfigurer {
@Bean
fun xsltViewResolver() = XsltViewResolver().apply {
setPrefix("/WEB-INF/xsl/")
setSuffix(".xslt")
}
}控制器实现
我们需要一个封装了逻辑的控制器来生成 XML 数据。
java
@Controller
public class XsltController {
@RequestMapping("/")
public String home(Model model) throws Exception {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("wordList");
List<String> words = Arrays.asList("Hello", "Spring", "Framework");
for (String word : words) {
Element wordNode = document.createElement("word");
Text textNode = document.createTextNode(word);
wordNode.appendChild(textNode);
root.appendChild(wordNode);
}
model.addAttribute("wordList", root);
return "home";
}
}kotlin
@Controller
class XsltController {
@RequestMapping("/")
fun home(model: Model): String {
val document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()
val root = document.createElement("wordList")
val words = listOf("Hello", "Spring", "Framework")
for (word in words) {
val wordNode = document.createElement("word")
val textNode = document.createTextNode(word)
wordNode.appendChild(textNode)
root.appendChild(wordNode)
}
model["wordList"] = root
return "home"
}
}你可以手动创建 DOM 文档(如上所示),也可以将 XML 文件加载为 Resource 使用。Spring 提供了极大的灵活性,让你可以根据模型以任何方式创建 DOM。
XSLT 转换
最后,XsltViewResolver 解析 "home" XSLT 模板文件,并将 DOM 文档合并到其中以生成视图。根据配置,模板文件位于 WEB-INF/xsl 目录下,扩展名为 .xslt。
XSLT 模板示例 (home.xslt)
xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<html>
<head><title>Hello!</title></head>
<body>
<h1>My First Words</h1>
<ul>
<xsl:apply-templates/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="word">
<li><xsl:value-of select="."/></li>
</xsl:template>
</xsl:stylesheet>生成的 HTML 结果
html
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello!</title>
</head>
<body>
<h1>My First Words</h1>
<ul>
<li>Hello</li>
<li>Spring</li>
<li>Framework</li>
</ul>
</body>
</html>补充教学
1. 为什么使用 XSLT?
- 强制解耦:XSLT 强制使视图逻辑与 Java 代码分离,你处理的是纯 XML 转换。
- 标准化:XSLT 是一门功能强大的行业标准语言,适合处理高度结构化的数据转换。
2. XSLT vs 其他模板引擎
在当今的 Web 开发中,XSLT 被认为比较“重”。它的语法相对复杂(基于 XML),而且学习曲线较陡。相比之下,Thymeleaf 或 FreeMarker 在处理动态 HTML 方面更加自然且高效。
3. 应用场景
XSLT 目前主要用于:
- B2B 集成:需要输出特定格式的 XML 报告或文档。
- 遗留系统转换:系统后端天然输出 XML 流,通过 XSLT 快速转换为 HTML。
- 多格式输出:同一个 XML 后台数据通过不同的 XSLT 转换成 XML、HTML、XSL-FO(进而转 PDF)等。