Show/Hide Toolbars

Руководство администратора

XSLT преобразования

Ссылки Назад Вверх Вперед

term_icon XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. В "Первой Форме" шаблон XSLT используется для преобразования данных, полученных из опубликованных SQL View, в определенный XML формат, соответствующий потребностям какой-либо внешней системы.

XSLT использует язык XPath для доступа к отдельным частям входного XML-документа и для организации вычислений.

warning_icon   По возможности преобразования данных следует выполнять на стороне SQL View, а не средствами XPath. Например, преобразование данных из денежного формата в числовой, очистку ДП типа "Большой текст с форматированием" от html-тегов и другие подобные операции оптимальнее выполнять уже при создании SQL View.   .

Выражения XPath

С помощью выражений XPath для выбора узлов в документе XML можно выбрать узел, следуя пути или шагам.

Полезные выражения для формирования пути

Выражение

Описание

имя_узла

Выбирает все узлы с именем имя_узла

/

Выбирает от корневого узла

warning_icon Если путь начинается с косой черты (/), он всегда представляет собой абсолютный путь к элементу!

//

Выбирает все узлы от текущего узла, которые соответствуют выбору, независимо от того, где они находятся

.

Выбирает текущий узел

..

Выбирает родителя текущего узла

@

Выбирает атрибуты

Примеры

bookstore

Выбирает все узлы с именем bookstore

/bookstore

Выбирает корневой элемент

bookstore/book

Выбирает все элементы book, которые являются потомками элемента bookstore

//book

Выбирает все элементы book независимо от того, где они находятся в документе

bookstore//book

Выбирает все элементы book, которые являются потомками элемента bookstore, независимо от того, где они находятся в ветви bookstore

//@lang

Выбирает все атрибуты, которые называются lang

Предикаты

Предикаты используются для поиска специфического узла или узла, который содержит специфическое значение. Предикаты всегда обрамляются квадратными скобками

Пример выражения

Результат

/bookstore/book[1]

Выбирает первый элемент book, который является потомком элемента bookstore

/bookstore/book[last()]

Выбирает последний элемент book, который является дочерним элементом элемента bookstore

/bookstore/book[last()-1]

Выбирает предпоследний элемент book, который является дочерним элементом элемента bookstore

/bookstore/book[position()<3]

Выбор первых двух элементов book, которые являются потомками элемента bookstore

//title[@lang]

Выбирает все элементы title, которые имеют атрибут с именем lang

//title[@lang='en']

Выбирает все элементы title, которые имеют атрибут lang со значением "en"

/bookstore/book[price>35.00]

Выбирает все элементы book после элемента bookstore, которые имеют элемент price со значением больше, чем 35.00

/bookstore/book[price>35.00]/title

Выбирает все элементы title элементов book из элемента bookstore, которые имеют элемент price со значением больше чем 35.00

Выбор неизвестных узлов

Wildcard

Результат

*

Соответствует любому узлу

@*

Соответствует узлу-атрибуту

node()

Соответствует любому узлу любого типа

//*

Выбирает все элементы в документе

Примеры

/bookstore/*

Выбирает все дочерние узлы элемента bookstore

//title[@*]

Выбирает все элементы title, которые имеют по крайней мере один атрибут любого вида

Выбор нескольких путей

Пример пути

Результат

//book/title | //book/price

Выбирает все элементы title И price всех элементов book

//title | //price

Выбирает все элементы title И price в документе

/bookstore/book/title | //price

Выбирает все элементы title элемента book элемента bookstore И все элементы price в документе

Элементы XPath

Элемент <xsl:stylesheet>

Элемент <xsl:template>

Элемент <xsl:strip-space>

Элемент <xsl:output>

Элемент <xsl:copy>

Элемент <xsl:apply-templates>

Элемент <xsl:attribute>

Элемент <xsl:choose>

Функция translate (XPath)

Элемент <xsl:element>

Элемент <xsl:value-of>

Пример XSLT преобразований

Пример XSL файла

Описание

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
<xsl:output method="xml" version="1.0" encoding="UTF-8"

indent="yes" cdata-section-elements="ExtParam999Value"/>

"Шапка" документа.

Функция strip-space, указанная в шапке документа", убирает лишние пробелы во всем документе

<xsl:template match="@*|node()">
 <xsl:copy >
         <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

определение функции преобразования match. Использовать ее предпочтительнее, чем copy, поскольку при использовании match можно одновременно переназначить имя элемента, а при использовании copy имя элементв результирующем файле сохраняется то же, что и в исходном

<xsl:template match="DocumentElement">
 <Ads formatVersion="3" target="Avito.ru">
         <xsl:apply-templates/>
 </Ads>
</xsl:template>

поскольку операторы xsl-template не могут быть вложенными, сначала отдельно выполняется преобразование родительского узла Ads, а затем дочерних узлов Ad

<xsl:template match="Objects_avito">
 <Ad>
         <xsl:apply-templates/>
 </Ad>
</xsl:template>

<xsl:template match="TaskID"> </xsl:template>

<xsl:template match="StateName"> </xsl:template>

<xsl:template match="ExtParam111Value"> </xsl:template>

если основные или дополнительные параметры, возвращаемые SQL View, не нужны в результирующем файле, для них создаются "пустые" преобразования.

В данном примере не нужны ID задачи, название статуса и значение ДП с ID=111

<xsl:template match="ExtParam222Value">
 <CompanyName>
         <xsl:apply-templates/>
 </CompanyName>
</xsl:template>

<xsl:template match="ExtParam333Value">
 <Price>
         <xsl:apply-templates/>
 </Price>
</xsl:template>

ДП с ID=222 записывается в поле с именем CompanyName

 

 

ДП с ID=333 записывается в поле с именем Price

 

 

<xsl:template match="ExtParam444Value">
 <Floor>
                 <xsl:apply-templates select="@*|node()"/>
 </Floor>
</xsl:template>

Рекурсивная обработка атрибутов, текста и элементов, пока не останется ни одного дочернего элемента

<xsl:template match="CreatedTime">
 <DateBegin><xsl:value-of select="substring-before(., 'T')"/></DateBegin>
</xsl:template>

Обрезание вывода формата даты с YYYY-MM-DDThh:mm:ss до YYYY-MM-DD

<xsl:template match="ExtParam555Value">
 <xsl:choose>
         <xsl:when test="//ExtParam555Value='Апартаменты'">
                 <Category>Квартиры</Category>
         </xsl:when>
         <xsl:otherwise>

         </xsl:otherwise>
 </xsl:choose>
</xsl:template>

Условное преобразование:

значение ДП с ID=555 записывается в  поле с именем Category. При этом если значение ДП равно "Апартаменты", то оно преобразуется в значение "Квартиры", иначе в поле  Category не записывается ничего

<xsl:template match="//url">
 <xsl:element name="Image">
         <xsl:attribute name="{name()}">
                 <xsl:value-of select="."/>
         </xsl:attribute>
 </xsl:element>
</xsl:template>

Поиск элемента "url", затем запись этого элемента в качестве атрибута в новый элемент "Image"

Полезные ссылки