Котеров Д. В., Костарев А. Ф. - PHP 5. 2-е издание (В подлиннике) - 2008
.pdf924 |
Часть 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. Функция может быть вызвана как именованный шаблон:
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>