XSLT 视图

XSLT 是一种 XML 转换语言,作为 Web 应用程序中的视图技术很受欢迎。如果您的应用程序自然处理 XML,或者如果您的模型可以轻松转换为 XML,那么 XSLT 可能是视图技术的不错选择。以下部分展示了如何在 Infra Web MVC 应用程序中生成 XML 文档作为模型数据并使用 XSLT 对其进行转换。

这是一个简单的 Infra 应用程序,它在 Controller 中创建一个单词列表并将它们添加到模型映射中。返回该映射以及我们的 XSLT 视图的视图名称。有关 Infra Web MVC 的 Controller 接口的详细信息,请参阅 注解控制器。XSLT 控制器将单词列表转换为简单的 XML 文档,以供转换。

Beans

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

  • Java

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

Controller

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

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

  • 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", "Infra", "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";
  }
}

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

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

转换

最后,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>

上述转换渲染为以下 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>Infra</li>
      <li>Framework</li>
    </ul>
  </body>
</html>