<?php /** @file * Provide QueryPath with XSLT support using the PHP libxslt module. * * This is called 'QPXSL' instead of 'QPXSLT' in accordance with the name * of the PHP extension that provides libxslt support. * * You must have PHP XSL support for this to function. * * @author M Butcher <matt@aleph-null.tv> * @license http://opensource.org/licenses/lgpl-2.1.php LGPL or MIT-like license. * @see QueryPathExtension * @see QueryPathExtensionRegistry::extend() * @see QPXSL * @see QPXML */ /** * Provide tools for running XSL Transformation (XSLT) on a document. * * This extension provides the {@link QPXSL::xslt()} function, which transforms * a source XML document into another XML document according to the rules in * an XSLT document. * * This QueryPath extension can be used as follows: * <code> * <?php * require 'QueryPath/QueryPath.php'; * require 'QueryPath/Extension/QPXSL.php'; * * qp('src.xml')->xslt('stylesheet.xml')->writeXML(); * ?> * * This will transform src.xml according to the XSLT rules in * stylesheet.xml. The results are returned as a QueryPath object, which * is written to XML using {@link QueryPath::writeXML()}. * </code> * * @ingroup querypath_extensions */ class QPXSL implements QueryPathExtension { protected $src = NULL; public function __construct(QueryPath $qp) { $this->src = $qp; } /** * Given an XSLT stylesheet, run a transformation. * * This will attempt to read the provided stylesheet and then * execute it on the current source document. * * @param mixed $style * This takes a QueryPath object or <em>any</em> of the types that the * {@link qp()} function can take. * @return QueryPath * A QueryPath object wrapping the transformed document. Note that this is a * <i>different</em> document than the original. As such, it has no history. * You cannot call {@link QueryPath::end()} to undo a transformation. (However, * the original source document will remain unchanged.) */ public function xslt($style) { if (!($style instanceof QueryPath)) { $style = qp($style); } $sourceDoc = $this->src->top()->get(0)->ownerDocument; $styleDoc = $style->get(0)->ownerDocument; $processor = new XSLTProcessor(); $processor->importStylesheet($styleDoc); return qp($processor->transformToDoc($sourceDoc)); } } QueryPathExtensionRegistry::extend('QPXSL');