* @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:
*
* 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()}.
*
*
* @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 any of the types that the
* {@link qp()} function can take.
* @return QueryPath
* A QueryPath object wrapping the transformed document. Note that this is a
* different 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');