Ваш первый шаг к написанию XSLT


Введение о 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,
но, как обычно, у нас есть константные символы для сравнения.

- &gt;  -> means greater than
- &lt;  -> means less than
-  =    -> means equal
- !=    -> means not equal
Вход в полноэкранный режим Выход из полноэкранного режима

Например, если нам нужны товары, цена которых больше 10$, то подобные вещи можно сделать с помощью циклов и условий, как показано на рисунке.

<xsl:for-each select="category/product">
      <xsl:if test="price &gt; 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 &gt; 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 является более мощным и оптимизированным, чем кодирование на вашем языке.

Оцените статью
Procodings.ru
Добавить комментарий