Архив метки: xml

Шаблонизатор на XML/XSLT: нет пути?

На прошлой неделе убил, наверное, целый день на то, чтобы сделать специфический шаблонизатор на XML/XSLT (сам проект на PHP). Все красиво и замечательно, но вот проблема: когда мы включаем содержимое внешнего файла конструкцией вида

<xsl:copy-of select="document('/include/something.html')" /> ,

надо иметь в виду, что содержимое этого файла обязано пройти валидацию. А если речь идет о том, чтобы включить что-то чужое (например, счетчик на JavaScript), валидацию оно как раз и не пройдет. Реальная жизнь — она такая.

Можно, конечно, поизвращаться, настругать каких-нибудь костылей, но красота и замечательность уйдут.

В итоге отказался от этой затеи, сами страницы оставил в XML, а шаблоны — классика, HTML с примесью PHP. Загружаю XML в DOMDocument и едем.

PHP, XML: изменение SimpleXMLElement с помощью XPath

Предположим, в переменной $item у нас хранится некий SimpleXMLElement, который мы хотим изменить. Самый прямолинейный способ выглядит примерно так:

$item->subitem->param->value = 'NewValue';

Однако если названия элементов содержат спецсимволы (например, двоеточие), то менять значения таким образом не получится. В таком случае можно экспортировать весь узел из SimpleXMLElement в DOMElement, затем изменить то, что нужно, с помощью XPath и импортировать назад. Пример:

$dom = new DOMDocument();
$dom_sxe = dom_import_simplexml($item);
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);
$xpath = new DOMXPath($dom);

$result = $xpath->query('Element:with:a:funky:name');
$result->item(0)->nodeValue = 'NewValue';

$item = simplexml_import_dom($dom);

Как отсюда видно, элемент с названием, содержащим двоеточия, помехой больше не является.