summaryrefslogtreecommitdiff
path: root/lib/querypath/src/QueryPath/Extension/QPXSL.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/querypath/src/QueryPath/Extension/QPXSL.php')
-rw-r--r--lib/querypath/src/QueryPath/Extension/QPXSL.php76
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/querypath/src/QueryPath/Extension/QPXSL.php b/lib/querypath/src/QueryPath/Extension/QPXSL.php
new file mode 100644
index 0000000..6a2727c
--- /dev/null
+++ b/lib/querypath/src/QueryPath/Extension/QPXSL.php
@@ -0,0 +1,76 @@
+<?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 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:
+ * <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 \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 <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 = \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));
+ }
+}