<?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');