|
xslt_set_scheme_handlers
Set the scheme handlers for the XSLT processor
(PHP 4 >= 4.0.6)
Code Examples / Notes » xslt_set_scheme_handlersohlesbeauxjours
xslt_set_scheme_handlers is a powerful feature, derived from the Sablotron engine, which can help in various situations. Briefly, it allows you to call any kind of PHP instruction, during the treatment of a stylesheet, through the XSLT document() function. For example, here is an implementation of the "file_exists()" PHP function : // Definition of the handler : function mySchemeHandler($processor, $scheme, $rest) { $rest=substr($rest,1); // to remove the first / automatically added by the engine if($scheme == 'file_exists') return '<?xml version="1.0" encoding="UTF-8"?><root>'.(file_exists($rest) ? "true" : "false")."</root>"; // result is embedded in a small xml string } // Initialisation of the handler (the "get_all" should be work in most cases) : $SchemeHandlerArray = array(); $SchemeHandlerArray["get_all"] = "mySchemeHandler"; // Start the engine : $params = array(); $xh = xslt_create(); xslt_set_scheme_handlers($xh,$SchemeHandlerArray); $result = xslt_process($xh,"myFile.xml","myFile.xsl",NULL,array(),$params); xslt_free($xh); echo $result; Then, inside the stylesheet, you can test whether a certain file exists with : <xsl:if test="document('file_exists:anotherXMLfile.xml)/root='true'"> < !-- bla bla bla --> </xsl:if> So finally, the principle is simple : - you define a scheme (here, I called it "file_exists") - you write the action associated to that scheme (in the mySchemeHandler function) - you embed the (probable) results in an XML string, that you return. - and in the stylesheet, you check : document('myPersonalURIscheme:myXPath') You can imagine many other uses for the mySchemeHandler() function. My framework is : PHP 4.2.3, Sablotron version 0.96, and Expat 1.95.5 Please note that some older version of PHP might require an additionnal parameter : mySchemeHandler($processor,$scheme,$rest,&$buffer) and you place your XML in $buffer, instead of returning it with return(). Baptiste cchittleborough
Here's some useful information I found in the PHP 4.3.4 source (in the file ext/xslt/README.XSLT-BACKENDS): void xslt_set_scheme_handlers(resource processor, array handlers) Registers the scheme handlers for the document (aka XPath handlers), given a XSLT processor resource (allocated by xslt_create()) and an array in the following format: array( "get_all" => function, "open" => function, "get" => function, "put" => function, "close" => function ) Where function is either a function name or an array in the following format: array(&$obj, "method") Note: You do not need to handle the array(&$obj, method") syntax by yourself as this is handled in the C call_xslt_function() library function (and more specifically, Zend's call_user_function_ex() function. Note: The given array does not need to contain all of the different scheme handler elements (although it can), but it only needs to conform to the "handler" => "function" format described above. Each of the individual scheme handler functions called are in the formats below: string get_all(resource processor, string scheme, string rest) resource open(resource processor, string scheme, string rest) int get(resource processor, resource fp, string &data) int put(resource processor, resource fp, string data) void close(resource processor, resource fp) |
Change Languagexslt_backend_info xslt_backend_name xslt_backend_version xslt_create xslt_errno xslt_error xslt_free xslt_getopt xslt_process xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_object xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers xslt_setopt |