KnigaRead.com/

Стивен Холзнер - XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Стивен Холзнер, "XSLT" бесплатно, без регистрации.
Перейти на страницу:

• должен поддерживать архитектуру XML W3C, хорошо взаимодействуя с другими стандартами в семействе XML;

• должен выражать свою модель данных в терминах информационного множества (infoset) XML;

• должен предоставлять общий ключевой синтаксис для XSLT 2.0 и XML Query language 1.0;

• должен поддерживать явное сравнение «for any» или «for all» и синтаксис равенства;

• должен расширять множество функций агрегации (например, пользователи XSLT часто требовали добавить функции min() и max());

• должен сохранять обратную совместимость с XPath 1.0;

• должен предоставлять функции пересечения и разности то есть — XPath 1.0 поддерживает объединение двух наборов узлов, и к этому должны быть добавлены функции пересечения и разности;

• должен поддерживать операцию унарного плюса (поскольку в схеме XML у десятичных чисел может присутствовать лидирующий плюс);

• должен улучшать удобство использования;

• должен снизить ограничения на шаги расположения;

• должен реализовывать условную операцию, оперирующую тремя выражениями — выражением 1 (логическая операция), выражением 2 и выражением 3. Если выражение 1 принимает значение «истина», должно вычисляться выражение 2, а если выражение 1 принимает значение «ложь», должно вычисляться выражение 3;

• должен определять последовательный синтаксис для подвыражений, обрабатывающих коллекции элементов;

• должен поддерживать дополнительные строковые функции. Например, W3C рассматривает вопрос добавления средств для замены в строках, заполнения символами и преобразований регистра;

• должен поддерживать функции агрегации при применении к коллекциям. Например, некоторым пользователям XPath 1.0 требовалось применить такую функцию агрегации, как sum, к значениям выражений, примененных к наборам узлов;

• должен поддерживать регулярные выражения для поиска в строках с использованием нотации регулярных выражений, установленной в схеме XML;

• должен поддерживать элементарные типы данных схемы XML. То есть в дополнение к типам, поддерживаемым моделью данных XPath 1.0, — строке, числу, логическому значению и набору узлов — модель данных XPath 2.0 должна поддерживать элементарные типы данных схемы XML;

• должен поддерживать представления чисел с плавающей точкой одинарной и двойной точности, поддерживаемые схемой XML, которая использует научную нотацию;

• должен определять подходящий набор функций для работы пользователя с элементарными типами данных схемы XML;

• должен добавлять в XPath тип данных «список» (поскольку схема XML позволяет определять простые типы, унаследованные от списка);

• должен поддерживать доступ к значениям простых типов элементов и атрибутов. Поскольку схемы XML представляют много новых типов, XPath 2.0 должен поддерживать доступ к собственному, простого типа, значению элемента или атрибута;

• должен определять поведение операторов для нулевых аргументов; 

• должен иметь средства для выбора элементов или атрибутов на основе явного типа схемы XML;

• должен иметь средства для выбора элементов или атрибутов на основе иерархии типов схемы XML;

• должен иметь средства для выбора элементов на основе групп подстановки схемы XML;

• должен поддерживать средства поиска, основанные на уникальных ограничениях и ключах схемы.

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

Глава 8

Работа с функциями XSLT и XPath

В этой главе мы изучим доступные вам в XSLT функции — как встроенные в XSLT, так и функции XPath. Вы уже встречались с этими функциями выборочно (например, с id, generate-id, position, count и т.д). В этой главе мы рассмотрим их все.

Некоторые функции входят в XSLT, некоторые пришли из XPath. И XSLT, и XPath обновляются до версии 2.0, и в конце главы я приведу список новых, готовящихся к выпуску функций. (Пока что никаких новых функций версии 2.0 еще не опубликовано.)

В XSLT встроены следующие функции:

• element-available();

• function-available();

• current();

• document();

• key();

• format-number();

• generate-id();

• system-property();

• unparsed-entity-uri().

Вы также можете пользоваться многими функциями XPath. Я сгруппирую их по типам данных XPath, с которыми они работают. Существует четыре типа данных: наборы узлов, строки, числа и логические значения. С наборами узлов работают следующие функции XPath:

• count();

• id();

• last();

• local-name();

• name();

• namespace-uri();

• position().

Следующие функции XPath работают со строками:

• concat();

• contains();

• normalize-space();

• starts-with();

• string();

• string-length();

• substring();

• substring-after();

• substring-before();

• translate().

Для работы с числами служат следующие функции XPath:

• ceiling();

• floor();

• number();

• round();

• sum().

И эти функции XPath работают с логическими значениями:

• boolean();

• false();

• lang();

• not();

• true().

В этой главе мы познакомимся с работой всех вышеназванных функций, а начнем с функций, встроенных в XSLT. Не обязательно читать всю главу подряд — скорее ею лучше пользоваться как справочным руководством: здесь перечислены все функции в удобном для просмотра виде.

Функции XSLT

В следующем списке перечислены встроенные в XSLT функции:

• current(). Возвращает текущий (current) узел — но не контекстный узел. Текущий узел — это узел, используемый в данный момент в таких циклах, как <xsl:for-each>. Функцию current нельзя применять в образцах;

• document(). Позволяет считывать несколько документов;

• element-available(). Показывает, доступен ли элемент расширения;

• format-number(). Форматирует числа при выводе;

• function-available(). Показывает, доступна ли функция расширения;

• generate-id(). Указывает процессору XSLT присвоить идентификатор узлу и возвратить его. При повторном применении generate-id к тому же узлу функция возвращает присвоенный ранее идентификатор;

• key(). Позволяет осуществлять поиск по ключу;

• system-property(). Позволяет проверить три системных свойства: xsl:version (версия XSLT, поддерживаемая процессором XSLT), xsl:vendor (производитель процессора XSLT) и xsl:vendor-url (URL производителя процессора XSLT);

• unparsed-entity-uri(). Предоставляет доступ к неразобранным сущностям, объявленным в DTD или схеме, через URI.

В следующих разделах все эти функции рассматриваются подробно и с примерами.

current()

Функция current возвращает текущий (current) — не контекстный (context) — узел. Контекстный узел шаблона — это узел в выбранном наборе узлов, к которому применяется шаблон. Текущий узел, с другой стороны, это используемый в данный момент узел в таких циклах, как <xsl:for-each>. Функция возвращает текущий узел как набор узлов с одним узлом:

node-set current()

Обратите внимание: current нельзя применять в образцах, поскольку образцы должны быть независимы от пути обработки, а способы реализации таких структур, как циклы, в процессорах XSLT могут различаться.

Следующий пример, в котором я выбираю элементы <PLANET> при помощи шаблона (листинг 8.1), демонстрирует работу функции current. Внутрь шаблона я поместил элемент <xsl:for-each>, и шаблон применяется только в том случае, если выбранный шаблоном контекстный узел в то же время является и текущим узлом в очередной итерации в элементе <xsl:for-each>.

Листинг 8.1. Применение функции current

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

  <HTML>

   .

   .

   .

    <TABLE BORDER=2>

     <TR>

      <TD>Name</TD>

      <TD>Mass</TD>

      <TD>Radius</TD>

      <TD>Day</TD>

     </TR>

     <xsl:apply-templates/>

    </TABLE>

   </BODY>

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <xsl:for-each select="/PLANETS/*[.=current()]">

   <TR>

    <TD><xsl:value-of select="NAME"/></TD>

    <TD><xsl:apply-templates select="MASS"/></TD>

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