Skip to content

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)等。

Based on Spring Framework.