/** * Convert documents between two formats * * Convert documents of the given type to the requested type. * * @param ezcDocumentXmlBase $doc * @return ezcDocumentXmlBase */ public function convert($doc) { // Create XSLT processor, if not yet initialized if ($this->xsltProcessor === null) { $stylesheet = new DOMDocument(); $stylesheet->load($this->options->xslt); $this->xsltProcessor = new XSLTProcessor(); $this->xsltProcessor->importStyleSheet($stylesheet); } // Set provided parameters. foreach ($this->options->parameters as $namespace => $parameters) { foreach ($parameters as $option => $value) { $this->xsltProcessor->setParameter($namespace, $option, $value); } } // We want to handle the occured errors ourselves. $oldErrorHandling = libxml_use_internal_errors(true); // Transform input document $dom = $this->xsltProcessor->transformToDoc($doc->getDomDocument()); $errors = $this->options->failOnError ? libxml_get_errors() : null; libxml_clear_errors(); libxml_use_internal_errors($oldErrorHandling); // If there are errors and the error handling is activated throw an // exception with the occured errors. if ($errors) { throw new ezcDocumentErroneousXmlException($errors); } // Reset parameters, so they are not automatically applied to the next // traansformation. foreach ($this->options->parameters as $namespace => $parameters) { foreach ($parameters as $option => $value) { $this->xsltProcessor->removeParameter($namespace, $option); } } // Build document from transformation and return that. return $this->buildDocument($dom); }