Использование пространства имен
Перед использованием пространств имен их надо определить в начале документа:
<xsl:stylesheet version="1.0" xslns:xsl="http://www.w3.org/1999/XSL/Transform" xslns:fb2="http://www.gribuser.ru/xml/fictionbook/2.0">
Ключи и выборка узлов по ключу
В базах данных ускорение выборки, доступа к отдельному элементу (или нахождение конкретных элементов), делается с помощью индексов — заранее предрасчитанных значений. База данных своими средствами заранее просматривает всю таблицу с данными и строит для себя список указателей на ту или иную запись. Т.е. индекс — это список заранее предрасчитанных значений, хранящихся в сортированном виде (что значительно ускоряет поиск).
Хотя индексы и потребляют лишнюю память, но они используются повсеместно, т.е. в несколько раз ускоряют выборку. Что-то похожее есть и в XSLT. Это называется — ключи.
Рассмотрим работу с ключом:
<!-- определение ключа --> <xsl:key name="name" <!-- имя ключа --> match="pattern" <!-- какие узлы документа процессор должен вернуть --> use="expression"/> <!-- по какому выражению производить отбор -->
Т.е. я говорю процессору: я хочу заранее сформировать список выборки узлов по какому-то условию. Т.е. мне надо часто получать доступ к определенным узлам входного документа, указывая ему какое-то условие отбора этих узлов. И процессор перед основной работой строит у себя в памяти этот индекс. У него в памяти появятся предрасчитанные значения. И тогда я могу в десятки раз быстрее получить доступ к выбранным узлам, не просто применяя Xpath, а используя функцию key ():
key('keyName','value')
Пример выборки по 1 ключу:
<!-- у нас есть список книг --> <xsl:key name="bookTitle" match="./book" use="title"/> <!-- сама выборка по ключевому слову в названии книги --> <xsl:apply-templates select="key('bookTitle','php')"/>
Выборка по нескольким ключам:
<!-- у нас есть список книг --> <xsl:key name="bookTitle" match="./book" use="concat(title, author)"/> <!-- сама выборка по ключевым словам --> <xsl:apply-templates select="key('bookTitle',concat('php','Leonov'))"/>
Т.е. в последнем примере используем конкатенацию — склеивание строк.