* @license MIT * @see QueryPath::Extension * @see QueryPath::ExtensionRegistry::extend() * @see QPXSL * @see QPXML */ namespace QueryPath\Extension; /** * 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 \QueryPath\Extension { protected $src = NULL; public function __construct(\QueryPath\Query $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 = \QueryPath::with($style); } $sourceDoc = $this->src->top()->get(0)->ownerDocument; $styleDoc = $style->get(0)->ownerDocument; $processor = new \XSLTProcessor(); $processor->importStylesheet($styleDoc); return \QueryPath::with($processor->transformToDoc($sourceDoc)); } }