РНР 5 в подлиннике

Страница 472 из 554


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

953

работку XSLT-программы по уровням, мы были вынуждены постоянно корректировать исходный XSLT-файл sonsg.xsl. Делать это вручную довольно-таки накладно, так что целесообразно доверить эту работу РНР-программе.

Так как подключение файлов, указанных в операторах xsl:include и xsl:import, происходит на этапе компиляции программы методом importstyiesheeto, то до момента вызова этого метода у нас есть возможность вставить необходимые операторы.

Программа setimportsLeveio, расположенная в файле xsl modify, inc (см. листинг 42.13), содержит список $importfiies подключаемых XSLT-файлов по уровням. Получая исходный XSLT-документ (без операторов <xsl:import.. ./>), она просматривает список XSL-файлов, необходимых для требуемого уровня, и добавляет XSL-операторы <xsi:import href='xsi-файл'/> в начале XSLT-программы.

; Листинг 42.13. Файл xslmodify.inc

<?php ## Исходный текст программ setlmportsLevel() и setOutputFormat().

* Добавить в XSL-программу $domxsl операторы import согласно уровню.

* @param domDocument $domxsl — XSLT-документ

* @param int $importlevel — число уровней импортирования

* @return — модифицированный XSLT-документ

* с добавленными операторами <xsl:import .../> */

function setlmportsLevel($domxsl, $importlevel) {

define('XSLTNS', 'http://www.w3.org/1999/XSL/Transform') ; $importfiles = Array( // список импортируемых файлов по уровням

0 => Array('stubs.xsl'),

1 => Array('song.xsl') ,

2 => Array('couplet.xsl', 'refrain.xsl', 'final.xsl') ,

3 => Array('line.xsl')

) ;

// корневой элемент

$stylesheet = $domxsl->documentElement;

// элемент, перед которым надо вставлять элементы <xsl:import href=''/> $beforeNode = $stylesheet->firstChild; // просмотреть файлы уровней

foreach ($importfiles as $level => $xslfiles) {

// если просматриваемый уровень больше требуемого — выйти if ($level > $importlevel) break; foreach ($xslfiles as $xslfile) {

// просмотреть список XSL-файлов, подключаемых в уровне

// создать элемент <xsl:import href='юш_ХБ'Ь-фдМла' />

$importnode = $domxsl->createElementNS(XSLTNS, 'xsl:import');

$importnode->setAttribute('href, $xslfile);

// вставить элемент перед "бывшим" первым элементом

$stylesheet->insertBefore($importnode, $beforeNode);

}

}

}

954

Часть VI. XML в РНР 5

* Установить атрибут method элемента output XSLT-программы Sdomxsl.

* @param domDocument Sdomxsl — XSLT-документ

* @param string $importlevel $outputformat - новое значение атрибута

* method

* @return — модифицированный XSLT-документ */

function setOutputFormat($domxsl, $outputformat) { $xpath - new domxpath($domxsl) ;

// путь до первого элемента output с атрибутом method $xpathStr = 1 /xsl: stylesheet/xsl:output/@method' ;

$nodeList = $xpath->query($xpathStr); // найти список узлов по пути $methodNode = $nodeList->item(0); // взять первый узел

if (SmethodNode) // узел есть?

$methodNode->value = $outputformat;

// установить требуемый режим вывода

}

Программа setOutputFormat о производит корректировку атрибута method элемента xsl:output согласно требуемому формату вывода. Назначение этого атрибута мы рассмотрим позднее.

Итак, после корректировки XSLT-программы (листинг 42.13) нам осталось лишь:

□ создать экземпляр класса xsltProcessor;

□ откомпилировать XSLT-программу методом importstyiesheet ();

□ установить параметр nsong вызываемой XSLT-программы методом setParameter ();

□ трансформировать входной документ методом transformtoXML($domxmi) и вывести полученный XML-документ.

setParameter(string namespace, string parametername, string parametervalue)

Метод setParameter о класса xsltProcessor принимает три параметра: первый параметр определяет область имен для устанавливаемого параметра; второй параметр — имя передаваемого параметра, а третий — его значение.

Для работы с параметрами класс xsltProcessor имеет также методы getParameterO и removeParameter().

getParameter(string namespace, string parametername)

Метод getParameter () возвращает установленное значение указанного параметра. removeParameter(string namespace, string parametername)

Метод removeParameter () сбрасывает указанный параметр, устанавливая его значение согласно оператору <xsi:param.. ./> XSLT-программы.

Все приведенные выше тексты выходных XHTML-программ формировались путем вызова описываемого скрипта songsToXML.php с параметрами:




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006