Введение о XSLT 📖
XSLT — это аббревиатура от eXtensible Stylesheet Language Transformation.
xslt — это язык преобразования XML документов, поэтому мы можем рассматривать его как таблицу стилей для XML, как CSS является таблицей стилей для HTML. Расширения XSLT файлов заканчиваются на .xslt или .xsl, каждое из которых является допустимым расширением.
Зачем использовать XSLT 🤔
Мы можем преобразовать XML файл в другой XML файл после внесения некоторых изменений, также у нас есть возможность преобразовать XML файл в HTML страницу, как в этом примере, у нас есть несколько товаров в категории и нам нужно создать таблицу с этими товарами.
<?xml version="1.0" encoding="UTF-8"?>
<category>
<product>
<name>watch</name>
<price>50.60$</price>
</product>
<product>
<name>IPhone 13</name>
<price>5055.999$</price>
</product>
<product>
<name>wallet</name>
<price>5.10$</price>
</product>
</category>
Это было сделано только с помощью кода XSLT, поэтому давайте немного углубимся в XSLT 👨💻
Базовая архитектура XSLT 🧱
Элементы
У нас есть несколько элементов, которые мы можем использовать в языке xslt, большинство из них вы можете найти в справочнике
for-each и value-of называются элементами, поэтому, как вывод, каждый параметр после xsl: называется элементом.
<xsl:for-each select="expression">
<!-- Content -->
</xsl:for-each>
<xsl:value-of select="expression" disable-output-escaping="yes|no" />
и, кстати, любое слово, написанное рядом с элементом в его области видимости в знаках <> называется атрибутом, так что если мне нужно добавить id для каждого товара, я могу поместить атрибут id в каждый элемент товара вот так.
<product id=1>
<name>watch</name>
<price>50.60$</price>
</product>
Но как использовать эти элементы и как сказать редактору, чтобы он включил эти элементы и распознал их, на все эти вопросы отвечает пространство имен этого языка.
Пространство имен
Первое, что вы должны написать в xslt-файле, это пространство имен, и вы можете написать его двумя разными способами, но с одинаковым результатом в конце.
Это похоже на добавление строки import package в java.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xsl:stylesheet и xsl:transform полностью идентичны в функциях
Переменные
Мы можем объявить глобальную или локальную переменную, как обычно в языках программирования, но разница в том, что после того, как вы установили значение переменной, вы не можете изменить это значение, поэтому оно считается окончательным в таких языках, как Java, PHP и Dart, давайте посмотрим, как объявить переменную.
<xsl:variable name="name" select="expression"> </xsl:variable>
<xsl:variable name="color" select="'red'" />
Имя переменной может быть задано в атрибуте name, также значение переменной может быть задано в атрибуте select, но у нас есть одно ограничение, мы должны поместить значение переменной, если это будет строка в кавычках, как в примере с красным цветом, а не просто поместить значение.
Также мы можем поместить значение из элемента xml в переменную, добавив его путь в атрибут select, например, если нам нужно поместить цену товара в переменную.
<xsl:variable name="price" select="category/product/price/text()" />
text() просто для преобразования значения в строку, как в предыдущем примере.
Циклы
В других языках очень легко написать цикл for, просто напишите for с определенным условием, здесь тоже самое, но с другим ключевым словом xsl:for-each, так что все будет именно так.
<xsl:for-each select="expression">
<!-- Content -->
</xsl:for-each>
Мы поместим в атрибут select путь к элементу, который нам нужно зациклить, например, в примере категории — продукт мы должны поместить путь к продуктам следующим образом
<xsl:for-each select="category/product">.
<!-- Content -->
</xsl:for-each>
Итак, теперь мы готовы перебрать все продукты с последним шагом, чтобы получить название продукта и цену, чтобы поместить их в таблицу, но как насчет того, если нам нужно просто показать продукт с определенной ценой, проверяя цену, если она больше или меньше или равна произвольному значению? Конечно, как вы и думали, так что давайте пойдем и съедим очень вкусную еду условия 😅.
Условия
У нас есть два способа сделать условие, первый — как обычное if.
<xsl:if test="expression">
...some output if the expression is true...
</xsl:if>
как мы теперь знаем, test — это атрибут, мы должны поместить наше условие вместо выражения в атрибут test,
но, как обычно, у нас есть константные символы для сравнения.
- > -> means greater than
- < -> means less than
- = -> means equal
- != -> means not equal
Например, если нам нужны товары, цена которых больше 10$, то подобные вещи можно сделать с помощью циклов и условий, как показано на рисунке.
<xsl:for-each select="category/product">
<xsl:if test="price > 10">
<!-- Content -->
</xsl:if>
</xsl:for-each>
Второй способ похож на switch case в других языках, в xslt называется choose — when.
<xsl:choose>
<xsl:when test="expression">
<!-- Content 1-->
</xsl:when>
<xsl:otherwise>
<!-- Content 2 -->
</xsl:otherwise>
</xsl:choose>
Также мы можем добавлять операторы when по мере необходимости, теперь давайте реализуем условие продуктов, но с помощью select — when.
<xsl:for-each select="category/product">
<xsl:choose>
<xsl:when test="price > 10">
<!-- display product -->
</xsl:when>
<xsl:otherwise>
<!-- hide product -->
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
Но что делать, если мы будем писать один и тот же код в разных местах, чтобы сделать какую-то логику, но в типичном виде, да вы правы используйте функции, давайте сделаем это 💪.
Функции
В c++ для написания функции нужно написать ее имя и параметры, а также тип возвращаемого значения, здесь же нам нужно только имя и параметр, поэтому вы можете вернуть любой тип, который вам нужен.
<xsl:function name="functionName">
<xsl:param name="param1"/>
<xsl:param name="param2"/>
<xsl:value-of select="return value"/>
</xsl:function>
Таким образом, объявить функцию очень просто, также как и вызвать ее.
<xsl:value-of select="functionName('param1','param2')"/>
скажите, что делает эта функция?
<xsl:function name="arbitraryName">
<xsl:param name="param1"/>
<xsl:param name="param2"/>
<xsl:value-of select="$param1 + param2"/>
</xsl:function>
<xsl:value-of select="arbitraryName('param1','param2')"/>
Да, вы правы, просто добавьте 2 числа.
Отлично, позвольте вас поздравить 🎉 теперь вы готовы посмотреть, как мы можем написать файл, который преобразует xml в html таблицы.
Но за шаг до этого, вы помните «<!—Content —«, который мы всегда писали в if’s body и в for’s body? Хорошо, мы можем заменить этот комментарий на то, что мы хотим, например, html теги, если нам нужно преобразовать xml файл в html или xml элементы, что угодно, вы представляете, что вы увидите сейчас в коде? Да, точно, просто я добавлю несколько html тегов, которые строят таблицы и помещу некоторые CSS стили в тег, так что это будет легко и просто, чувак 😃.
<!-- namespace and version -->
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- access the root element -->
<xsl:template match="/">
<html>
<body>
<h2 align="center">My Products Collection</h2>
<table border="1" align="center">
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Price</th>
</tr>
<!-- access the path to products -->
<xsl:for-each select="category/product">
<!-- display all product without any conditions -->
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Заключение 😃
То, что мы сделали с Xslt, мы также можем сделать с любым языком программирования, но в некоторых случаях выбор xslt является более мощным и оптимизированным, чем кодирование на вашем языке.