跳到主要内容

XSLT 视图

ChatGPT-4o-mini 中英对照 XSLT Views

XSLT 是一种用于 XML 的转换语言,并且在 Web 应用程序中作为视图技术非常流行。如果您的应用程序自然处理 XML,或者您的模型可以轻松转换为 XML,那么 XSLT 可以作为一种良好的视图技术。以下部分展示了如何生成一个 XML 文档作为模型数据,并在 Spring Web MVC 应用程序中使用 XSLT 进行转换。

这个示例是一个简单的 Spring 应用程序,它在 Controller 中创建一个单词列表,并将其添加到模型映射中。该映射与我们的 XSLT 视图的视图名称一起返回。有关 Spring Web MVC 的 Controller 接口的详细信息,请参见 Annotated Controllers。XSLT 控制器将单词列表转换为一个简单的 XML 文档,以便进行转换。

Beans

配置对于一个简单的 Spring web 应用程序是标准的:MVC 配置必须定义一个 XsltViewResolver bean 和常规的 MVC 注解配置。以下示例展示了如何做到这一点:

@EnableWebMvc
@ComponentScan
@Configuration
public class WebConfig implements WebMvcConfigurer {

@Bean
public XsltViewResolver xsltViewResolver() {
XsltViewResolver viewResolver = new XsltViewResolver();
viewResolver.setPrefix("/WEB-INF/xsl/");
viewResolver.setSuffix(".xslt");
return viewResolver;
}
}
java

Controller

我们还需要一个 Controller 来封装我们的单词生成逻辑。

控制器逻辑被封装在一个 @Controller 类中,处理方法定义如下:

@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";
}
}
java

到目前为止,我们只创建了一个 DOM 文档并将其添加到模型映射中。请注意,您还可以将 XML 文件加载为 Resource 并使用它来替代自定义的 DOM 文档。

有可用的软件包可以自动将对象图“转换”为 DOM,但在 Spring 中,您可以完全灵活地以任何您选择的方式从模型创建 DOM。这防止了 XML 转换在模型数据结构中占据过大部分,这在使用工具管理 DOM 转换过程时是一个危险。

转换

最后,XsltViewResolver 解析“home” XSLT 模板文件,并将 DOM 文档合并到其中以生成我们的视图。如 XsltViewResolver 配置所示,XSLT 模板位于 war 文件中的 WEB-INF/xsl 目录,并以 xslt 文件扩展名结尾。

以下示例展示了一个 XSLT 转换:

<?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>
xml

前面的转换呈现为以下 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>
html