XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. В "Первой Форме" шаблон XSLT используется для преобразования данных, полученных из опубликованных SQL View, в определенный XML формат, соответствующий потребностям какой-либо внешней системы. |
---|
XSLT использует язык XPath для доступа к отдельным частям входного XML-документа и для организации вычислений.
По возможности преобразования данных следует выполнять на стороне SQL View, а не средствами XPath. Например, преобразование данных из денежного формата в числовой, очистку ДП типа "Большой текст с форматированием" от html-тегов и другие подобные операции оптимальнее выполнять уже при создании SQL View. . |
---|
Выражения XPath
С помощью выражений XPath для выбора узлов в документе XML можно выбрать узел, следуя пути или шагам.
Полезные выражения для формирования пути
Выражение |
Описание |
|
---|---|---|
имя_узла |
Выбирает все узлы с именем имя_узла |
|
/ |
Выбирает от корневого узла
|
|
// |
Выбирает все узлы от текущего узла, которые соответствуют выбору, независимо от того, где они находятся |
|
. |
Выбирает текущий узел |
|
.. |
Выбирает родителя текущего узла |
|
@ |
Выбирает атрибуты |
|
Примеры |
||
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
Пример XSLT преобразований
Пример XSL файла |
Описание |
---|---|
<?xml version="1.0"?> indent="yes" cdata-section-elements="ExtParam999Value"/> |
"Шапка" документа. Функция strip-space, указанная в шапке документа", убирает лишние пробелы во всем документе |
<xsl:template match="@*|node()"> |
определение функции преобразования match. Использовать ее предпочтительнее, чем copy, поскольку при использовании match можно одновременно переназначить имя элемента, а при использовании copy имя элементв результирующем файле сохраняется то же, что и в исходном |
<xsl:template match="DocumentElement"> |
поскольку операторы xsl-template не могут быть вложенными, сначала отдельно выполняется преобразование родительского узла Ads, а затем дочерних узлов Ad |
<xsl:template match="Objects_avito"> |
|
<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"> <xsl:template match="ExtParam333Value"> |
ДП с ID=222 записывается в поле с именем CompanyName
ДП с ID=333 записывается в поле с именем Price
|
<xsl:template match="ExtParam444Value"> |
Рекурсивная обработка атрибутов, текста и элементов, пока не останется ни одного дочернего элемента |
<xsl:template match="CreatedTime"> |
Обрезание вывода формата даты с YYYY-MM-DDThh:mm:ss до YYYY-MM-DD |
<xsl:template match="ExtParam555Value"> </xsl:otherwise> |
Условное преобразование: значение ДП с ID=555 записывается в поле с именем Category. При этом если значение ДП равно "Апартаменты", то оно преобразуется в значение "Квартиры", иначе в поле Category не записывается ничего |
<xsl:template match="//url"> |
Поиск элемента "url", затем запись этого элемента в качестве атрибута в новый элемент "Image" |
Полезные ссылки