XSLT — це мова перетворення XML, яка популярна як технологія подання у вебдодатках. XSLT може бути продуманим вибором як технологія подання, якщо твоя програма природним чином працює з XML або якщо твою модель можна легко перетворити на XML. У наступному розділі показано, як створити XML-документ як дані моделі та перетворити його за допомогою XSLT у додатку на Spring Web MVC.

Цей приклад є найпростішим додатком Spring, який створює список слів в Контролер і додає їх до Map моделі. Повертається Map, а також ім'я подання нашого XSLT-подання. Контролер XSLT перетворює список слів на простий XML-документ, готовий до перетворення.

Біни

Конфігурація є стандартною для простого вебдодатку Spring: Конфігурація MVC повинна визначати бін XsltViewResolver та звичайну конфігурацію анотацій MVC. У цьому прикладі показано, як це зробити:

Java
@EnableWebMvc
@ComponentScan
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public XsltViewResolver xsltViewResolver() {
        XsltViewResolver viewResolver = новий XsltViewResolver();
        viewResolver.setPrefix("/WEB-INF/xsl/");
        viewResolver.setSuffix(".xslt");
        return viewResolver;
    }
}
Kotlin
@EnableWebMvc
@ComponentScan
@Configuration
class WebConfig : WebMvcConfigurer {
    @Bean
    fun xsltViewResolver() = XsltViewResolver().apply {
        setPrefix("/WEB-INF/xsl/")
        setSuffix(".xslt")
    }
}

Контролер

Нам також потрібний контролер, який інкапсулює нашу логіку генерації слів.

Логіка контролера укладена в класі, позначеному анотацією @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", "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
import org.springframework.ui.set
@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-документ і додали його до моделі Map. Зверни увагу, що також можна завантажити XML-файл як Resource і використовувати його замість кастомного DOM-документа.

Існують програмні пакети, які автоматично "DOMіфікують" об'єктний граф, але Spring забезпечує цілковиту гнучкість у частині створення DOM з твоєї моделі будь-яким вибраним вами способом. Це дозволяє запобігти перетворенню XML, що відіграє надто велику роль у структурі даних твоєї моделі, і це становить небезпеку при використанні інструментів для керування процесом DOMіфікації.

Перетворення

Нарешті, XsltViewResolver дозволяє "домашній" файл шаблону 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>Spring</li>
            <li>Framework</li>
        </ul>
    </body>
</html>