Kniga-Online.club

Алексей Валиков - Технология XSLT

Читать бесплатно Алексей Валиков - Технология XSLT. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

□ Если второй численный аргумент меньше 1 (это относится и к отрицательной бесконечности), то подстрока будет пустой.

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

Примеры

substring('123456', 2, 3) → '234'

substring('123456', 2, 5) → '23456'

substring('123456', 2, 6) → '23456'

substring('123456', 2) → '23456'

substring('123456', -4) → '123456'

substring('123456', 5, 5) → '5'

substring('123456', 5) → '56'

substring ('123456', 6) → '6'

substring('123456', 1 div 0, ) → ''

substring('123456', 2, -1) → ''

Функция string-length

number string-length(string?)

Функция string-length возвращает число символов строкового аргумента. Если аргумент опущен, string-length возвращает длину строкового представления контекстного узла.

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

Примеры

string-length('Barnes and Noble') →16

string-length('Barness#x20;& Noble') → 14

Функция normalize-space

string normalize-space(string?)

Функция normalize-space производит со своим строковым аргументом так называемую нормализацию пробельного пространства. Это означает, что в строке удаляются ведущие и заключающие пробельные символы, а все последовательности пробелов заменяются одним пробельным символом. Иными словами, функция удаляет "лишние" пробелы в строке.

Если аргумент функции опущен, она выполняется со строковым значением контекстного узла.

Примеры

normalize-space(' А - В - С ') → 'А-В-С'

normalize-space('А &#х9; В &#х9; С') > 'A B C'

Функция translate

string translate(string, string, string)

Функция translate производит замену символов первого своего строкового аргумента, которые присутствуют во втором аргументе на соответствующие символы третьего аргумента.

Пример

translate('abcdefgh', 'aceg', 'ACEG') → 'AbCdEfGh'

Если некоторый символ повторяется во втором аргументе несколько раз, учитывается только первое его появление.

Пример

translate('abcdefgh', 'acaeaga', 'ACBECGD') → 'AbCdEfGh'

Если второй аргумент длиннее третьего, символы, для которых нет соответствующей замены, удаляются из строки.

Пример

translate('a b-c=d+e|f/gh', 'aceg-=+|/', 'ACEG') → 'AbCdEfGh'

Если третий аргумент длиннее второго, остаток строки игнорируется.

Пример

translate('abcdefgh', 'aceg', 'ACEGBDFH') → ' AbCdEfGh'

Функцию translate можно использовать, например, для изменения регистра символов. Конечно, это будет работать только для тех языков, для которых такая функция будет записана, но и этого в большинстве случаев будет достаточно. В будущем предполагается включить в новые версии языка более мощные функции для работы с регистрами символов.

Пример

Для того чтобы изменять регистр слов русского языка, мы можем определить две переменные, lowercase и uppercase, которые будут содержать строчные и прописные символы основного русского алфавита (мы включили в него букву ё — строчную ("ё") и прописную ("Ё"), хотя в соответствии с Unicode она относится к расширениям). Мы также создадим два именованных шаблона, которые будут менять регистр символов строкового параметра str. Для удобства использования мы вынесем определения переменных и шаблонов во внешний модуль ru.xsl.

Листинг 6.6. Преобразование ru.xsl

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:variable

  name="uppercase"

  select="concat('&#x410;&#x411;&#x412;&#x413;',

                 '&#x414;&#x415;&#x401;&#x416;&#x417;',

                 '&#x418;&#x419;&#x41A;&#x41B;',

                 '&#x41C;&#x41D;&#x41E;&#x41F;',

                 '&#x420;&#x421;&#x422;&#x423;',

                 '&#x424;&#x425;&#x426;&#x427;',

                 '&#x428;&#x429;&#x42A;&#x42B;',

                 '&#x42C;&#x42D;&#x42E;&#x42F;')"/>

 <xsl:variable

  name="lowercase"

  select="concat('&#x430;&#x431;&#x432;&#x433;',

                 '&#x434;&#x435;&#x451;&#x436;&#x417;',

                 '&#x438;&#x439;&#x43A;&#x43B;',

                 '&#x43C;&#x43D;&#x43E;&#x43F;',

                 '&#x440;&#x441;&#x442;&#x443;',

                 '&#x444;&#x445;&#x446;&#x447;',

                 '&#x448;&#x449;&#x44A;&#x44B;',

                 '&#x44C;&#x44D;&#x44E;&#x44F;')"/>

 <xsl:template name="lower">

  <xsl:param name="str"/>

  <xsl:value-of select="translate($str, $uppercase, $lowercase)"/>

 </xsl:template>

 <xsl:template name="upper">

  <xsl:param name="str"/>

  <xsl:value-of select="translate($str, $lowercase, $uppercase)"/>

 </xsl:template>

</xsl:stylesheet>

Использовать этот модуль можно, включив или импортировав его в основное преобразование элементами xsl:include или xsl:import. После этого в основном преобразовании будут доступны переменные lowercase и uppercase, которые можно будет использовать в функции translate и шаблоны с именами lower и upper.

Использовать функцию translate с переменными lowercase и uppercase можно следующим образом:

translate('Дом', $uppercase, $lowercase) → 'дом'

translate('Дом', $lowercase, $uppercase) → 'ДОМ'

Именованные шаблоны можно вызывать элементом xsl:call-template, передавая параметр при помощи xsl:with-param. Например, следующий фрагмент шаблона

...

<xsl:call-template name="lower">

 <xsl:with-param name="str" select="'Дом'"/>

</xsl:call-template>

...

создаст в выходящем дереве текстовый узел со значением "дом".

Функции множеств узлов

Функции last и position

number last()

number position()

Функция last возвращает текущий размер контекста — число, которое показывает, сколько узлов находится в обрабатываемом в данный момент множестве.

Функция position возвращает позицию контекста — число, показывающее порядковый номер контекстного узла в обрабатываемом множестве.

Пример

В этом примере мы будем заменять все элементы элементами вида

<element name="..." position="...">

 ...

</element>

где атрибут name будет содержать имя, a position — через дробь позицию элемента в контексте и размер контекста.

Листинг 6.7. Входящий документ

<а>

 <b/>

 <c/>

 <d>

  <e/>

  <f/>

 </d>

</a>

Листинг 6.8. Преобразование

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output indent="yes"/>

 <xsl:strip-space elements="*"/>

 <xsl:template match="*">

  <element name="{name()}" pos="{position()}/{last()}">

   <xsl:apply-templates/>

  </element>

 </xsl:template>

</xsl:stylesheet>

Листинг 6.9. Выходящий документ

<element name="a" pos="1/1">

 <element name="b" pos="1/3"/>

 <element name="c" pos="2/3"/>

 <element name="d" pos="3/3">

  <element name="e" pos="1/2"/>

  <element name="f" pos="2/2"/>

 </element>

</element>

Отметим, что если бы мы не удаляли лишние пробельные символы во входящем документе при помощи элемента xsl:strip-space, в контексте преобразования учитывались бы также и текстовые узлы, которые им соответствуют. Выходящий документ без этого элемента имел бы следующий вид:

<element name="a" pos="1/1">

 <element name="b" pos="2/7"/>

 <element name="c" pos="4/7"/>

 <element name="d" pos="6/7">

Перейти на страницу:

Алексей Валиков читать все книги автора по порядку

Алексей Валиков - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Технология XSLT отзывы

Отзывы читателей о книге Технология XSLT, автор: Алексей Валиков. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*