18 define(
'XSLT_PROCESSOR_ENCODING',
Config::getVar(
'i18n',
'client_charset'));
20 define(
'XSL_TRANSFORMER_DOCTYPE_STRING', 0x01);
21 define(
'XSL_TRANSFORMER_DOCTYPE_FILE', 0x02);
22 define(
'XSL_TRANSFORMER_DOCTYPE_DOM', 0x03);
53 $this->errors = array();
62 self::$externalParameterSnippet =
Config::getVar(
'cli',
'xslt_parameter_option');
65 if (self::$externalCommand) {
67 if ( strpos(self::$externalCommand,
'%xsl') ===
false )
return false;
68 if ( strpos(self::$externalCommand,
'%xml') ===
false )
return false;
69 self::$processor =
'External';
71 } elseif (extension_loaded(
'xsl') && extension_loaded(
'dom')) {
73 self::$processor =
'PHP';
106 $this->registerPHPFunctions = $flag;
118 return $this->
transform($xmlFile, XSL_TRANSFORMER_DOCTYPE_FILE, $xslFile, XSL_TRANSFORMER_DOCTYPE_FILE, XSL_TRANSFORMER_DOCTYPE_STRING);
128 return $this->
transform($xml, XSL_TRANSFORMER_DOCTYPE_STRING, $xsl, XSL_TRANSFORMER_DOCTYPE_STRING, XSL_TRANSFORMER_DOCTYPE_STRING);
143 function transform($xml, $xmlType, $xsl, $xslType, $resultType) {
146 if ($xmlType == XSL_TRANSFORMER_DOCTYPE_FILE) {
147 if (!$fileManager->fileExists($xml))
return false;
149 if ($xslType == XSL_TRANSFORMER_DOCTYPE_FILE) {
150 if (!$fileManager->fileExists($xsl))
return false;
154 assert($resultType != XSL_TRANSFORMER_DOCTYPE_FILE);
156 switch (self::$processor) {
185 if ($xmlType != XSL_TRANSFORMER_DOCTYPE_FILE || $xslType != XSL_TRANSFORMER_DOCTYPE_FILE)
return false;
188 if ( strpos(self::$externalCommand,
'%xsl') ===
false )
return false;
189 if ( strpos(self::$externalCommand,
'%xml') ===
false )
return false;
192 $parameterString =
'';
193 foreach ($this->parameters as $name => $value) {
194 $parameterString .= str_replace(array(
'%n',
'%v'), array($name, $value), self::$externalParameterSnippet);
198 $xsltCommand = str_replace(array(
'%xsl',
'%xml',
'%params'), array($xsl, $xml, $parameterString), self::$externalCommand);
201 if( !ini_get(
'safe_mode') ) $xsltCommand = escapeshellcmd($xsltCommand);
204 exec($xsltCommand .
' 2>&1', $contents, $status);
207 if ($status !=
false) {
209 $this->
addError(implode(
"\n", $contents));
215 $resultXML = implode(
"\n", $contents);
217 switch ($resultType) {
218 case XSL_TRANSFORMER_DOCTYPE_STRING:
222 case XSL_TRANSFORMER_DOCTYPE_DOM:
224 $resultDOM =
new DOMDocument(
'1.0', XSLT_PROCESSOR_ENCODING);
225 $resultDOM->recover =
true;
226 $resultDOM->substituteEntities =
true;
227 $resultDOM->resolveExternals =
true;
230 $resultDOM->loadXML($resultXML);
248 function _transformPHP($xml, $xmlType, $xsl, $xslType, $resultType) {
250 if ($xmlType == XSL_TRANSFORMER_DOCTYPE_DOM) {
252 assert(is_a($xml,
'DOMDocument'));
256 $xmlDOM =
new DOMDocument(
'1.0', XSLT_PROCESSOR_ENCODING);
263 $xmlDOM->recover =
true;
264 $xmlDOM->substituteEntities =
true;
265 $xmlDOM->resolveExternals =
true;
269 case XSL_TRANSFORMER_DOCTYPE_FILE:
273 case XSL_TRANSFORMER_DOCTYPE_STRING:
274 $xmlDOM->loadXML($xml);
283 if ($xslType == XSL_TRANSFORMER_DOCTYPE_DOM) {
285 assert(is_a($xsl,
'DOMDocument'));
289 $xslDOM =
new DOMDocument(
'1.0', XSLT_PROCESSOR_ENCODING);
293 case XSL_TRANSFORMER_DOCTYPE_FILE:
297 case XSL_TRANSFORMER_DOCTYPE_STRING:
298 $xslDOM->loadXML($xsl);
311 if ($this->registerPHPFunctions) {
316 if (is_array($this->parameters)) {
317 foreach ($this->parameters as $param => $value) {
318 $processor->setParameter(
null, $param, $value);
326 switch($resultType) {
327 case XSL_TRANSFORMER_DOCTYPE_STRING:
328 $resultXML =
$processor->transformToXML($xmlDOM);
331 case XSL_TRANSFORMER_DOCTYPE_DOM:
332 $resultDOM =
$processor->transformToDoc($xmlDOM);
345 array_push($this->errors, $error);