75 lines
2.4 KiB
PHP
75 lines
2.4 KiB
PHP
<?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'); |