Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Котеров Д. В., Костарев А. Ф. - PHP 5. 2-е издание (В подлиннике) - 2008

.pdf
Скачиваний:
6286
Добавлен:
29.02.2016
Размер:
11.36 Mб
Скачать

924

Часть VI. XML в PHP 5

version = { nmtoken } encoding = { string }

omit-xml-declaration = { "yes" | "no" } standalone = { "yes" | "no" } doctype-public = { string } doctype-system = { string } cdata-section-elements = { qnames } indent = { "yes" | "no" }

media-type = { string }> <-- Content: template --> </exsl:document>

Весь код, сгенерированный в рамках данного элемента, будет записан в файл, указанный параметром href.

Рассмотрим пример использования данного элемента (листинг 42.27).

Листинг 42.27. Файл common/document.xsl (пример использования элемента exsl:document)

<?xml version='1.0' encoding='KOI8-R'?> <xsl:stylesheet version='1.0'

xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="html" encoding="KOI8-R" indent="yes"/> <xsl:template match="/">

<html>

<head><title>Frame example</title></head> <frameset cols="20%, 80%">

<frame src="toc.html"/>

<exsl:document href="toc.html" encoding="KOI8-R"> <html>

<head><title>Содержание</title></head>

<body>

<xsl:apply-templates mode="toc" select="//Содержание"/> </body>

</html>

</exsl:document>

<frame src="body.html"/>

<exsl:document href="body.html" encoding="KOI8-R"> <html>

<head><title>Страница</title></head>

<body>

<xsl:apply-templates select="//Страница"/> </body>

</html>

</exsl:document>

</frameset>

</html>

Глава 42. Расширение XSLT

925

</xsl:template>

</xsl:stylesheet>

В программе document.xsl генерируется HTML-код, содержащий два фрейма с адресами toc.html и body.html. Причем оба фрейма генерируются в этой же программе.

Файл toc.html генерируется в рамках элемента <exsl:document href="toc.html"...>. В тело body этого файла включается содержимое элемента Содержание входного документа.

Файл body.html генерируется в рамках элемента <exsl:document href="body.html"...>. В тело body этого файла включается содержимое элемента Страница входного документа.

Пример XML-файла показан в листинге 42.28.

Листинг 42.28. Входной файл common/document.xml

<?xml version='1.0' encoding='KOI8-R'?> <Книга> <Содержание> Глава1 Глава2 Глава3 </Содержание> <Страница>

В данной главе мы рассмотрим применение

...

</Страница>

</Книга>

Результат выполнения этой программы показан в листингах 42.29—42.31.

Листинг 42.29. Результат выполнения скрипта

php exslt.php common/document.xsl common/document.xml

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=KOI8-R"> <title>Frame example</title>

</head>

<frameset cols="20%, 80%"> <frame src="toc.html"> <frame src="body.html"> </frameset>

</html>

Листинг 42.30. Сформированный файл toc.html

<html>

<head>

926

Часть VI. XML в PHP 5

<meta http-equiv="Content-Type" content="text/html; charset=KOI8-R">

<title>Содержание</title>

</head>

<body>

Глава1

Глава2

Глава3

</body>

Листинг 42.31. Сформированный файл body.html

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=KOI8-R"> <title>Страница</title>

</head>

<body>

В данной главе мы рассмотрим применение

...

</body>

При использовании элемента <exsl:document> следует иметь в виду, что он пока не входит в разряд стандартных, и не все XSLT-процессоры с поддержкой EXSLT могут его обрабатывать.

Функция node-set позволяет представить XSLT-переменную как XML-документ. Пример использования данной функции приведен в листинге 42.32.

Листинг 42.32. Пример использования функции node-set

<?xml version='1.0' encoding='KOI8-R'?> <xsl:stylesheet version='1.0'

xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method="html" encoding="KOI8-R" indent="yes"/>

<xsl:variable name="tree"><a><b><c><d/></c></b></a></xsl:variable> <xsl:template match="/">

<out>

<xsl:value-of select="count(exsl:node-set($tree)//*)"/> </out>

</xsl:template>

</xsl:stylesheet>

Так как для выполнения данного скрипта практически не требуется входной файл, мы создадим XML-файл empty.xml, содержащий единственный корневой элемент

<empty/>.

Результат выполнения XSLT-программы показан в листинге 42.33.

Глава 42. Расширение XSLT

927

Листинг 42.33. Результат выполнения скрипта

php exslt.php common/node-set.xsl empty.xml

<out>4</out>

Функция object-type позволяет определить тип данных переменной, которая передается ей в качестве аргумента. Пример использования функции приведен в листинге 42.34.

Листинг 42.34. Пример использования функции object-type

<?xml version='1.0' encoding='KOI8-R'?> <xsl:stylesheet version='1.0'

xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:variable name="tree">

<a><b><c><d/></c></b></a>

</xsl:variable>

<xsl:variable name="string" select="'fred'"/> <xsl:variable name="number" select="93.7"/> <xsl:variable name="boolean" select="true()"/> <xsl:variable name="node-set" select="//*"/> <xsl:template match="/">

<out>:

<xsl:value-of select="exsl:object-type($string)"/>; <xsl:value-of select="exsl:object-type($number)"/>; <xsl:value-of select="exsl:object-type($boolean)"/>; <xsl:value-of select="exsl:object-type($node-set)"/>; <xsl:value-of select="exsl:object-type($tree)"/>; <xsl:if test="function-available('saxon:expression')"

xmlns:saxon="http://icl.com/saxon">

<xsl:value-of select="exsl:object-type(saxon:expression('item'))"/> </xsl:if>;

</out>

</xsl:template>

</xsl:stylesheet>

Результат выполнения XSLT-программы — в листинге 42.35.

Листинг 42.35. Результат выполнения скрипта

php exslt.php common/object-type.xsl empty.xml

<?xml version="1.0"?> <out>:

string;

number;

boolean; node-set;

928

Часть VI. XML в PHP 5

RTF;

external;

</out>

Обе описанные функции входят в ядро расширения XSLT.

Модуль Math

Модуль Math принадлежит области имен http://exslt.org/math. Рекомендуемый префикс для функций и элементов данного модуля — math.

Все функции, поддерживаемые модулем Math, делятся на два набора — базовые (stable), которые входят в ядро (Core) и поддерживаются всеми XSLT-процессорами с расширением XSLT, и дополнительные (not stable), которые могут поддерживаться процессорами.

В рассмотренном модуле Common элемент <exsl:document> был в дополнительном наборе (not stable), функции же object-type и node-set входили в базовый (stable) набор.

Базовый набор функций модуля Math содержит функции:

number math:min(node-set) — функция возвращает значение узла с минимальным значением и может быть вызвана как именованный шаблон:

<xsl:call-template name="math:min"> <xsl:with-param name="nodes" select="node-set" /> </xsl:call-template>

number math:max(node-set) — функция возвращает значение узла с максимальным значением и может быть вызвана как именованный шаблон:

<xsl:call-template name="math:max"> <xsl:with-param name="nodes" select="node-set" /> </xsl:call-template>

node-set math:highest(node-set) — функция возвращает список узлов с максимальным значением. Может быть вызвана как именованный шаблон:

<xsl:call-template name="math:highest"> <xsl:with-param name="nodes" select="node-set" /> </xsl:call-template>

node-set math:lowest(node-set) — функция возвращает список узлов с минимальным значением и может быть вызвана как именованный шаблон:

<xsl:call-template name="math:lowest"> <xsl:with-param name="nodes" select="node-set" /> </xsl:call-template>

В дополнительный набор входят функции:

number math:abs(number) — абсолютное значение узла;

number math:sqrt(number) — квадратный корень узла. Функция может быть вызвана как именованный шаблон:

Глава 42. Расширение XSLT

929

<xsl:call-template name="math:sqrt">

<xsl:with-param name="value" select="number" />

</xsl:call-template>

number math:power(base, power) — значение base, возведенное в степень power. Функция может быть вызвана как именованный шаблон:

<xsl:call-template name="math:power"> <xsl:with-param name="base" select="number" /> <xsl:with-param name="power" select="number" /> </xsl:call-template>

number math:constant(constant_name, precision) — функция возвращает указанную константу (constant_name) с заданной точностью (precision). Поддерживаются следующие константы: PI, E, SQRT2, LN2, LN10, LOG2E, SQRT1_2. Данная функция может быть вызвана и как именованный шаблон:

<xsl:call-template name="math:constant"> <xsl:with-param name="name" select="string" /> <xsl:with-param name="precision" select="number" /> </xsl:call-template>

number math:log(number) — натуральный логарифм числа;

number math:random() — случайное число в диапазоне [0; 1);

number math:sin(number) — синус числа в радианах;

number math:cos(number) — косинус числа в радианах;

number math:asin(number) — арксинус числа;

number math:acos(number) — арккосинус числа в радианах;

number math:tan(number) — тангенс числа в радианах;

number math:atan(number) — арктангенс числа в радианах;

number math:atan2(y,x) — угол в радианах от оси X до точки point(y,x);

number math:exp(number) — e в степени number.

XSLT-процессор PHP 5 поддерживает как базовый, так и дополнительный набор функций. Пример использования этих функций приведен в листинге 42.36.

Листинг 42.36. Пример использования функций модуля Math

<?xml version='1.0' encoding='KOI8-R'?> <xsl:stylesheet version='1.0'

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

xmlns:math="http://exslt.org/math" xsl:extension-element-prefixes="math"

>

<xsl:output method="xml" encoding="KOI8-R" indent="yes"/> <xsl:template match="values">

<result>

930

Часть VI. XML в PHP 5

<xsl:text>

Максимум: </xsl:text>

<xsl:value-of select="math:max(value)" /> <xsl:text>

Минимум: </xsl:text>

<xsl:value-of select="math:min(value)" /> <xsl:text>

2**10=</xsl:text>

<xsl:value-of select="math:power(2,10)" /> <xsl:text>

</xsl:text>

</result>

</xsl:template>

</xsl:stylesheet>

Входной файл numbers.xml и результат выполнения показаны в листингах 42.37 и 42.38.

Листинг 42.37. Входной файл numbers.xml

<?xml version='1.0' encoding='KOI8-R'?>

<values>

<value>7</value>

<value>11</value>

<value>8</value>

<value>4</value>

</values>

Листинг 42.38. Результат вызова скрипта

php exslt.php math/math.xsl math/numbers.xml

<?xml version="1.0" encoding="KOI8-R"?> <result>

Максимум: 11 Минимум: 4 2**10=1024

</result>

Модуль Sets

Модуль Sets принадлежит области имен http://exslt.org/sets. Рекомендуемый префикс для функций и элементов данного модуля — set.

Также как и модуль Math, модуль Sets поддерживает только функции. Он не вводит никаких новых элементов. Все функции модуля Sets входят в базовый (stable) набор, который содержит:

node-set set:difference(node-set1, node-set2) — функция возвращает узлы, входящие в node-set1, но не входящие в node-set2. Функция может быть вызвана как именованный шаблон:

Глава 42. Расширение XSLT

931

<xsl:call-template name="set:difference">

<xsl:with-param name="nodes1" select="node-set" />

<xsl:with-param name="nodes2" select="node-set" />

</xsl:call-template>

node-set set:intersection(node-set1, node-set2) — функция возвращает узлы, входящие и в node-set1, и в node-set2. Функция может быть вызвана как именованный шаблон:

<xsl:call-template name="set:intersection"> <xsl:with-param name="nodes1" select="node-set" /> <xsl:with-param name="nodes2" select="node-set" /> </xsl:call-template>

node-set set:distinct(node-set) — функция возвращает список узлов, имеющих разные значения. Если в node-set существуют узлы с одинаковыми значениями, то в результат включается только первый из этих узлов. Функция может быть вызвана как именованный шаблон:

<xsl:call-template name="set:distinct"> <xsl:with-param name="nodes" select="node-set" /> </xsl:call-template>

boolean set:has-same-node(node-set1, node-set2) — функция возвращает значение true, если node-set1 и node-set2 имеют общие узлы. Функция может быть вызвана как именованный шаблон:

<xsl:call-template name="set:has-same-node"> <xsl:with-param name="nodes" select="node-set" /> <xsl:with-param name="node" select="node-set" /> </xsl:call-template>

node-set set:leading(node-set1, node-set2) — функция возвращает список узлов node-set1, которые предшествуют первому узлу node-set2. Функция может быть вызвана как именованный шаблон:

<xsl:call-template name="set:leading"> <xsl:with-param name="nodes" select="node-set" /> <xsl:with-param name="node" select="node-set" /> </xsl:call-template>

node-set set:trailing(node-set1, node-set2) — функция возвращает список узлов node-set1, которые следуют после первого узла node-set2.

<xsl:call-template name="set:trailing"> <xsl:with-param name="nodes" select="node-set" /> <xsl:with-param name="node" select="node-set" /> </xsl:call-template>

В качестве демонстрации возможностей функций модуля Sets рассмотрим XMLфайл htmltags.xml (листинг 42.39).

932

Часть VI. XML в PHP 5

Листинг 42.39. Файл htmltags.xml описания атрибутов HTML-тегов

<tags>

<img src='uri' width='number' height='number' alt='string'/> <table width='...' height='...'/>

<script src='uri'/> <frame src='uri'/> <iframe src='uri'/> <hr width='number'/>

<td width='number' height='number'/> <th width='number' height='number'/> <tr width='number' height='number'/> </tags>

В файле описаны атрибуты некоторых HTML-тегов.

Рассмотрим EXSLT-программу, отображающую списки HTML-тегов, имеющих атрибуты src, width, src и width, src без width и width без src (листинг 42.40).

Листинг 42.40. Пример использования функций модуля Sets

<?xml version='1.0' encoding='KOI8-R'?> <xsl:stylesheet version='1.0'

xmlns:set="http://exslt.org/sets" extension-element-prefixes="set" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method="xml" encoding="KOI8-R" indent="yes"/> <xsl:variable name="src"

select="//*[@src]" /> <xsl:variable name="width"

select="//*[@width]" /> <xsl:template match="/">

<out>

<div>

Теги, имеющие атрибут src:

<xsl:for-each select="$src"> <xsl:call-template name='showlist'/>

</xsl:for-each> </div>

<div>

Теги, имеющие атрибут width:

<xsl:for-each select="$width"> <xsl:call-template name='showlist'/>

</xsl:for-each> </div>

<div>

Теги, имеющие атрибуты src и width:

<xsl:for-each select="set:intersection($src, $width)"> <xsl:call-template name='showlist'/>

</xsl:for-each>

Глава 42. Расширение XSLT

933

</div>

<div>

Теги, имеющие атрибут src, но не имеющие атрибута width: <xsl:for-each select="set:difference($src, $width)">

<xsl:call-template name='showlist'/> </xsl:for-each>

</div>

<div>

Теги, имеющие атрибут width, но не имеющие атрибута src: <xsl:for-each select="set:difference($width, $src)">

<xsl:call-template name='showlist'/> </xsl:for-each>

</div>

</out>

</xsl:template>

<xsl:template name="showlist"> <xsl:value-of select="name()" />

<xsl:if test="position()!=last()">,</xsl:if> </xsl:template>

</xsl:stylesheet>

В переменные src и width помещаются списки элементов с соответствующими атрибутами. В корневом шаблоне последовательно выводятся список узлов переменных src, width, их пересечение и разности (см. листинг 42.41).

Листинг 42.41. Результат выполнения скрипта

php exslt.php sets/setexample.xsl sets/htmltags.xml

<?xml version="1.0" encoding="KOI8-R"?> <out>

<div>

Теги, имеющие атрибут src: img,script,frame,iframe</div>

<div>

Теги, имеющие атрибут width: img,table,hr,td,th,tr</div>

<div>

Теги, имеющие атрибуты src и width: img</div>

<div>

Теги, имеющие атрибут src, но не имеющие атрибута width: script,frame,iframe</div>

<div>

Теги, имеющие атрибут width, но не имеющие атрибута src: table,hr,td,th,tr</div>

</out>

Модуль Functions

Модуль Functions принадлежит области имен http://exslt.org/functions. Рекомендуемый префикс для функций и элементов данного модуля — func.