Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : XSLT Functions

XSLT Functions

Introduction

This PHP extension provides a processor independent API to XSLT transformations. Currently this extension only supports the Sablotron library from the Ginger Alliance. Support is planned for other libraries, such as the Xalan library or the libxslt library.

XSLT (Extensible Stylesheet Language (XSL) Transformations) is a language for transforming XML documents into other XML documents. It is a standard defined by The World Wide Web Consortium (W3C). Information about XSLT and related technologies can be found at » http://www.w3.org/TR/xslt.

Note:

This extension is different than the sablotron extension distributed with versions of PHP prior to PHP 4.1.0, currently only the new XSLT extension in PHP 4.1.0 is supported. If you need support for the old extension, please ask your questions on the PHP mailing lists.

Note:

This extension has been moved to the » PECL repository and is no longer bundled with PHP as of PHP 5.0.0.

Note:

If you need xslt support with PHP 5 you can use the XSL extension.

Requirements

This extension uses Sablotron and expat, which can both be found at » http://www.gingerall.org/sablotron.php. binaries are provided as well as source.

Installation

On Unix, run configure with the --enable-xslt --with-xslt-sablot options. The Sablotron library should be installed somewhere your compiler can find it.

Make sure you have the same libraries linked to the Sablotron library as those, which are linked with PHP. The configuration options: --with-expat-dir=DIR --with-iconv-dir=DIR are there to help you specify them. When asking for support, always mention these directives, and whether there are other versions of those libraries installed on your system somewhere. Naturally, provide all the version numbers.

Caution:

Be sure your Sablot library is linked to -lstdc++ as otherwise your configure will fail, or PHP will fail to run or load.

JavaScript E-XSLT support:

If you compiled Sablotron with JavaScript support, you must specify the option: --with-sablot-js=DIR.

Note to Win32 Users:

In order for this extension to work, there are DLL files that must be available to the Windows system PATH. See the FAQ titled "How do I add my PHP directory to the PATH on Windows" for information on how to do this. Although copying DLL files from the PHP folder into the Windows system directory also works (because the system directory is by default in the systems PATH), it is not recommended. This extension requires the following files to be in the PATH: sablot.dll, expat.dll, and iconv.dll

For PHP <= 4.2.0, the file iconv.dll is not required.

Runtime Configuration

This extension has no configuration directives defined in php.ini.

Resource Types

This extension defines a XSLT processor resource returned by xslt_create().

Predefined Constants

The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.

XSLT_OPT_SILENT (integer)
Drop all logging and error reporting. This is a generic option for all backends that may be added in the future.
XSLT_SABOPT_PARSE_PUBLIC_ENTITIES (integer)

Tell Sablotron to parse public entities. By default this has been turned off.

XSLT_SABOPT_DISABLE_ADDING_META (integer)

Do not add the meta tag "Content-Type" for HTML output. The default is set during compilation of Sablotron.

XSLT_SABOPT_DISABLE_STRIPPING (integer)
Suppress the whitespace stripping (on data files only).
XSLT_SABOPT_IGNORE_DOC_NOT_FOUND (integer)
Consider unresolved documents (the document() function) non-lethal.
XSLT_SABOPT_FILES_TO_HANDLER (integer)
XSLT_ERR_UNSUPPORTED_SCHEME (integer)
Error return code, for scheme handlers.

Table of Contents

xslt_backend_info — Returns the information on the compilation settings of the backend
xslt_backend_name — Returns the name of the backend
xslt_backend_version — Returns the version number of Sablotron
xslt_create — Create a new XSLT processor
xslt_errno — Returns an error number
xslt_error — Returns an error string
xslt_free — Free XSLT processor
xslt_getopt — Get options on a given xsl processor
xslt_process — Perform an XSLT transformation
xslt_set_base — Set the base URI for all XSLT transformations
xslt_set_encoding — Set the encoding for the parsing of XML documents
xslt_set_error_handler — Set an error handler for a XSLT processor
xslt_set_log — Set the log file to write log messages to
xslt_set_object — Sets the object in which to resolve callback functions
xslt_set_sax_handler — Set SAX handlers for a XSLT processor
xslt_set_sax_handlers — Set the SAX handlers to be called when the XML document gets processed
xslt_set_scheme_handler — Set Scheme handlers for a XSLT processor
xslt_set_scheme_handlers — Set the scheme handlers for the XSLT processor
xslt_setopt — Set options on a given xsl processor

Code Examples / Notes » ref.xslt

sandro_zic

[Editor's note: moved this note here where it belongs - jmcastagnetto@php.net]
This shows how you can use the XSLT functions to add dynamic content to the result tree, i.e. how to hand over parameters to the XSL stylesheet and write to Sablotron's document buffer.
First we assign the value of the parameter to an array in PHP:
-----------------------------------------
$xslt_params["test"] = "Run-time parameter.";
-----------------------------------------
The parameter is envoced in XSL by
-----------------------------------------
<h1>Value of run-time parameter:</h1>
<b><xsl:value-of select="$test" /></b>
<hr/>
-----------------------------------------
Don't forget to define the parameter at the beginning of your stylesheet:
-----------------------------------------
<xsl:param name="test"/>
-----------------------------------------
How can we add dynamic content from a database to the XSLT output? In Sablotron, this is done using the document buffer function.
Retrieve a table's content, store it in a XML structure assigned to an array in PHP:
-----------------------------------------
$xslt_args["buffer1"] =
"
<TestBuffer>
<Message>
<Content>
This is message 1 of buffer 1.
</Content>
</Message>
<Message>
<Content>
This is message 2 of buffer 1.
</Content>
</Message>
</TestBuffer>
";
-----------------------------------------
This is how you add the buffer to the result tree in your XSL document:
-----------------------------------------
<h1>Dynamic content from document buffer 1:</h1>
<xsl:for-each select="document('arg:/buffer1')/TestBuffer/Message">
<b><xsl:value-of select="Content" /></b><br/>
</xsl:for-each>
<hr/>
-----------------------------------------
To get the whole thing running, following functions have to be executed:
-----------------------------------------
$processor = xslt_create();
xslt_run ($processor, "file://".$DOCUMENT_ROOT.$xsl_file, "file://".$DOCUMENT_ROOT.$xml_file, "arg:/_result", $xslt_params, $xslt_args);
$result = xslt_fetch_result ($processor);
echo $result;
-----------------------------------------
The complete XSL file looks like this:
-----------------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="1.0" standalone="yes" indent="yes" />
<!-- define parameter -->
<xsl:param name="test"/>
<xsl:template match="/">
<!-- run-time parameter -->
<h1>Value of run-time parameter:</h1>
<b><xsl:value-of select="$test" /></b>
<hr/>
<!-- dynamic content -->
<h1>Dynamic content from document buffer 1:</h1>
<xsl:for-each select="document('arg:/buffer1')/TestBuffer/Message">
<b><xsl:value-of select="Content" /></b><br/>
</xsl:for-each>
<hr/>
</xsl:template>
</xsl:stylesheet>
-----------------------------------------


pete silvester

When installing on debian using apt/binaries, after installing php4-xslt and sablotron, you may have to add this line to /etc/php4/apache/php.ini :
extension=xslt.so


nicolas_rainardnospam

The XSLTProcessor, when transforming a document, always resolves entities.
To avoid this (if you want to keep HTML entitities by ex.), you have two solutions:
- if you have full control over the input document, you can encapsulate every text element which contains entities in a CDATA section.
- the previous solution is the smarter and the less computing intensive, but it is not always possible. In other cases, what you can do is to replace every occurence of '&' (entity mark) by something which will be considered as normal text by the parser (let's say '[AMP]' by ex) in the input document before the transformation. After the transformation, you can get these entitites back in the output document by reversing the previous operation.
<?php
$xml = $input_dom->saveXML();
$xml = str_replace('&', '[AMP]', $xml);
$input_dom->loadXML($xml);
$xml = $xsl->transformToXML($input_dom);
$xml = str_replace('[AMP]', '&', $xml);
$output_dom->loadXML($xml);
?>
Warning : this second method "escapes" ALL entities, even those you wouldn't want to be escaped. This is a raw explanation, fine-tune it to your own situation.


ken1138

The XSLT functions may experience conflicts with Apache in some configurations, causing random segfaults in httpd.  Apache has included a 'lite' version of expat in their recent distributions, which can cause conflicts with expat.  Apache1.3.22 solves the problem by configuring itself to use the expat you have installed, instead of the built-in. If you compiled Apache before you installed expat, make sure you upgrade and/or recompile your Apache server with the same version of expat that PHP and Sablotron are using.

gbarattokillspammers

Regarding the `__gxx_personality_v0' problem described by dennisNOSPAM@infoleak.com, you have to use LDFLAGS=-lstdc++  as well before configuring php (and not apache) when compiling php as a shared object.
Thank you Dennis


bat

maurits says that libxslt should be preferred over Sablotron, but I disagree.  libxslt only implements a fraction of the capabilities of Sablotron; in particular, this doesn't work in libxslt:
   <xsl:variable name="x">
     <a>One</a>
     <a>Two</a>
     <a>Three</a>
   </xsl:variable>
   <xsl:for-each select="$x/a">
     <xsl:value-of select="."/>
   </xsl:for-each>
In Sablotron, which implements XSLT 1.1, this works fine.  In libxslt's version, XSLT 1.0, a variable is a "result tree fragment", not a nodeset, and you are arbitrarily not allowed to do as much with it.
Further, Sablotron allows callbacks via the document() function (see information on xslt_set_scheme_handler()) and appears to give /slightly/ more informative error messages -- they identify the line number in the XSLT file at least.
In general, I can't recommend libxslt, which appears very underpowered.  Sablotron is considerably more impressive.


arossato

It is possible to create the xslt extension as a shared object module statically linked with salbot and expat (I needed it for a project hosted in sourceforge where the sablot library is available).
Compile the module as usual:
cd ext/xslt
phpize
./configure --enable-module=so --enable-xslt=shared --with-xslt-sablot --with-expat
make
Then create a statically linked module:
gcc -Wl,-Bstatic -shared  xslt.lo sablot.lo  -o xslt.so  /usr/local/lib/libsablot.a /usr/local/lib/libexpat.a --static-libgcc
change /usr/local/lib/libsablot.a and /usr/local/lib/libexpat.a according to the right path on your system.
You're done!
My xslt.so is 5.2M...


07-apr-2001 05:14


xavier

In the case of Zend Core under Windows, what worked for me was to add:
extension=php_xsl.dll
to the php.ini file


ohlesbeauxjours

In reply to Jaron, who needed to evaluate PHP code inside the stylesheet, look at a post I sent about xslt_set_scheme_handlers().
Scheme handlers are very useful, since they allow the XSLT engine and PHP to fully interact (they will communicate through XML strings).
With xslt_set_scheme_handlers(), you can give the XSLT engine an advanced access to the file system (or even to the other I/O interfaces), and perform various tasks (checking the existence of a file, creating new files "on the fly", deleting, etc...)
... all that in only one stylesheet :)
baptiste


jw

In addition to "tk dot lists at fastmail dot fm"'s comment on Windows dependencies: You'll also need iconv.dll in your SYSTEM32 folder. At least, that's what I needed to get it working on my PHP4.2.3-Win install.

tom

If you're wrangling with a plist in Mac OS X: here a bit of code to convert the plist into xml using xslt and then accessing it using simplexml. This was modified from http://www.xmldatabases.org/WK/blog/1086?t=item . Please do post improvements. This has been tested against iPhoto's AlbumData as well as iTunes' data. Enjoy!
<?php
$xsl = new DomDocument();
$xsl->load("plistConvert.xsl");
$inputdom = new DomDocument();
$inputdom->load("iTunes Music Library.xml");
$proc = new XsltProcessor();
$proc->registerPhpFunctions();
$xsl = $proc->importStylesheet($xsl);
$newdom = $proc->transformToDoc($inputdom);
$sxe = simplexml_import_dom($newdom);
print('<pre>');
print_r($sxe->dict);
print('</pre>');
?>
Here's the plistConvert.sxl file:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl  ="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/plist">
 <propertylist>
   <xsl:apply-templates/>
 </propertylist>
</xsl:template>
<xsl:template match="dict">
 <dict>
   <xsl:for-each select="key">
     <xsl:variable name='n1' select='translate(., " ", "_")'/>
     <xsl:variable name='pName'>
       <xsl:choose>
           <!-- Need to do this because number tags like <0> are not valid?! -->
         <xsl:when test='contains("0123456789", substring($n1, 1, 1))'>
           <xsl:value-of select='concat("number_", $n1)'/>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select='$n1'/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
     <xsl:element name="{$pName}">
       <xsl:for-each select='following-sibling::*[1]'>
         <xsl:choose>
           <xsl:when test='name() = "dict"'>
             <xsl:apply-templates select='.'/>
           </xsl:when>
           <xsl:when test='name() = "array"'>
             <xsl:attribute name="array">collection</xsl:attribute>
             <xsl:apply-templates/>
           </xsl:when>
           <xsl:when test='name() = "string"'>
             <xsl:value-of select='.'/>
           </xsl:when>
           <xsl:when test='name() = "integer"'>
<!--              <xsl:attribute name="type">integer</xsl:attribute> -->
             <xsl:value-of select='.'/>
           </xsl:when>
           <xsl:when test='name() = "date"'>
<!--              <xsl:attribute name="type">date</xsl:attribute> -->
             <xsl:value-of select='.'/>
           </xsl:when>
           <xsl:when test='name() = "true"'>True</xsl:when>
           <xsl:when test='name() = "false"'>False</xsl:when>
           <xsl:when test='name() = "real"'>
             <xsl:value-of select='.'/>
           </xsl:when>
           <xsl:when test='name() = "data"'>
             <xsl:value-of select='.'/>
           </xsl:when>
           
           <xsl:otherwise>
             <xsl:message>pListConverter: <xsl:value-of select='name()'/> not implemented!
             </xsl:message>
           </xsl:otherwise>
         </xsl:choose>
       </xsl:for-each>
     </xsl:element>
   </xsl:for-each>
 </dict>
</xsl:template>
<!-- don't pass text thru -->
<xsl:template match="text()|@*">
</xsl:template>
</xsl:stylesheet>


gabriel a-t bumpt do-t net

If you need to transform an XML document that specifies the URL of its own prefered stylesheet (using the processing instruction <?xml-stylesheet href="xyz.xsl"?>, you can start by parsing the XML data to retrieve that URL, and then call the xslt_process function using the specified stylesheet :
<?php
/* A small class for stylesheet URL extraction from an XML */
class XMLStylesheet
{
var $hParser;
var $xml;
var $stylesheet;
function XMLStylesheet($filename)
{
$this->hParser = xml_parser_create();
xml_set_object($this->hParser, $this);
xml_set_processing_instruction_handler($this->hParser, 'fnProcessingInstruction');
$this->xml = file_get_contents($filename);
xml_parse($this->hParser, $this->xml, true);
xml_parser_free($this->hParser);
}
function getStylesheet()
{
return $this->stylesheet;
}

function fnProcessingInstruction($hParser, $target, $data)
{
if($target == 'xml-stylesheet')
{
ereg('href="([^"]+)"', $data, $regs);
$this->stylesheet = $regs[1];
}
}
}
/* Now, instanciate an object of this class, given the filename of our XML data */
$xml = new XMLStylesheet('my_data.xml');
/* And finally, retrieve the URL of the stylesheet specified in the XML data. */
$xsl_url = $xml->getStylesheet());
/* Now you can xslt_process as usual. */
?>


d dot brotherstone

If you get problems with undefined references to gxx_s type stuff, UPDATE LIBTOOL!  I found 1.4.1 worked for some configurations, 1.4.3 worked for almost none, but 1.5 worked for every combination of Sablotron/gettext/sybase/zlib/postgres --with options I tried.  
Make sure you follow the advice of adding -lstdc++ to EXTRA_LD_FLAGS in Makefile after you've run ./configure, and BEFORE you've run make (if you issue make, you'll need to do a make clean before you make again, after changing the Makefile, or it still won't work reliably).
Cheers, Dave.


drtebi

I would like to add that there is no problem to install PHP with Sablotron on a Gentoo Linux system (http://www.gentoo.org).
Just make sure you emerged the expat and sablotron packages like so:
emerge expat
emerge sablotron
After this, there should be no linking problem or whatsoever:
./configure --with-xslt --with-sablotron
make
and you should be set ;-)


maurits

I tried to get Sablotron runnning on a Windows XP - Apache 2 -PHP5 System which is my developement system. I have Sablotron running on a life Linux server. After spending lots of  effort I gave up on Sablotron on Windows.
Then I found out that there is Libxslt, and it is allready working!
I am missing a hint on this page, that Sablotron is not really recommended any more and that people should start to migrate their code to Libxslt.


d dot u

I extended the example of shanks (very helpful for me tnx), so you can call php inside your xslt file, I had the problem to pass url-parameters and did not understand how to solve it, so I use php.
<code>
<?php
/**
*
* A class to transform XML through XSLT using PHP4 Sablotron extension
*
*/
#######################################################################
## file extended by Daniel Unterberger (d.u@mail.com)
## changes: some  php:eval's added
class xsltTransform
{
   var $xsl_file;
   var $xml_file;
   var $fileName;
   /**
    * Constructor to the xsl_transform ticket
    *
    * @param $xsl_file The XSLT file containing the transformation info
    * @param $xml_file The XML file containing the actual data
    * @see readFile()
    */
   function xsltTransform($xsl_file = '', $xml_file = '')
   {
       $this->xsl_string = $this->readFile($xsl_file,'php:eval');
       $this->xml_string = $this->readFile($xml_file);
   }
   /**
    * Function to read through the file
    *
    * @param $fileName Which file to read?
    *
    */
   function readFile($fileName,$php_eval="")
   {
       // get contents of a file into a string
       $fd = fopen( $fileName, "r" );
       $content = fread( $fd, filesize( $fileName ) );
       fclose( $fd );
       ##################################################
       ## extension by Daniel Unterberger (d.u@mail.com)
       while ( $php_eval and ( $pos_start=strpos($content,'<php:eval>') ))
       {
         $pos_end=strpos($content,'</php:eval>');
         $content=substr($content,0,$pos_start).
                  eval( substr($content,$pos_start+10,$pos_end-$pos_start-10) ).
                  substr($content,$pos_end+11);
       }
       if ($GLOBALS["debug"]=="ON") print "<xmp>$content</xmp>";
           ## see xslt-file for debuggin if you call page.php?debug=ON (remove on life-server)
       ###################################################
       ## end extension
       return $content;
   }
   /**
    * Function to apply the actual transformation
    *
    */
   function applyTransformation()
   {
       $this->result = '';
       $this->msg = xslt_process($this->xsl_string, $this->xml_string, $this->result);
       if(!$this->msg) print ("Transformation failed.");
       return $this->result;
   }
// End of class, do not remove
}
?>
</code>
in the xslt you can call it now with
...
<tag><php:eval> return $GLOBALS["filter"]; /* all php allowed */ </php:eval></tag>
...
-------------------------------
hope this gives new inspiration
(d.u)


jaron dot schaeffer

I extended the example of Daniel Unterberger even more. I had the problem to evaluate PHP code within my xml data files (e.g. to output database results) and after that apply a xsl stylesheet to the generated data.
When I tried Daniel's solution I found it quite useful but noticed that you can't "print out" from your PHP Code. You're bound to annoying return()-Statements, wich makes it impossible to loop outputs or concatenate strings and then return them. If you try to do so, you will notice that a statement like
...
<php:eval>
 for($i=0; $i<10; $i++)
   echo "This is number ".$i;
</php:eval>
...
will result in PHP to do the output right in the moment when the eval()-Statement is run.
Things do, at least, work fine if you keep it simple:
...
<php:eval>
 return("Hello World!");
</php:eval>
...
I tried to fix that and came to a solution. The following code is just a snippet from my XSLT-class. The uppercase letters are constants defined in a header file. (e.g. define('PHP_EVAL_START_TAG', '<php:eval>');
...
function xmlString() {
   $fd = fopen($this->xmlFileLocation, 'r');
   $xmlString = fread($fd, filesize($this->xmlFileLocation));
   fclose($fd);
   if($this->contentType == DYNAMIC_CONTENT) {
     while(!(strpos($xmlString, PHP_EVAL_START_TAG) === false)) {
$startPos = strpos($xmlString, PHP_EVAL_START_TAG);
$endPos   = strpos($xmlString, PHP_EVAL_END_TAG);
ob_start();
eval(substr($xmlString, $startPos + strlen(PHP_EVAL_START_TAG), $endPos - $startPos - strlen(PHP_EVAL_START_TAG)));
$evaluatedString = ob_get_contents();
ob_end_clean();
$xmlString =
  substr($xmlString, 0, $startPos).$evaluatedString.substr($xmlString, $endPos + 11);
     }
   }
   
   return($xmlString);
 }
...
Jaron.Schaeffer@jayweb.de


armencho

I believe the xslt_process and its URI resolving behaviour, including the xslt_set_base function are violating the XSLT specification which states:
<blockquote>
3.2 Base URI
Every node also has an associated URI called its base URI, which is used for resolving attribute values that represent relative URIs into absolute URIs. If an element or processing instruction occurs in an external entity, the base URI of that element or processing instruction is the URI of the external entity; otherwise, the base URI is the base URI of the document. The base URI of the document node is the URI of the document entity. The base URI for a text node, a comment node, an attribute node or a namespace node is the base URI of the parent of the node.
</blockquote>
This implies that if stylesheet file A contains a <xsl:import href="../B.xsl" /> and stylesheet file B contains a <xsl:import href="../C.xsl" />, given that all physical paths are valid, no matter which base you set up for the XSLT extension (with xslt_set_base) the processor WILL FAIL. Simply because it uses a single base path for all its processing regardless of the context (importing file) which includes/imports. This is a violation of the above part of the specification quoted above.
And it makes it very difficult to program XSLT with PHP.


jon dawson

Getting XSLT running under Red Hat/Plesk 7.5
The PHP installation on my VPS came with '--enable-xslt=shared' '--with-xslt-sablot' '--with-sablot-js=/usr' in the config line. However could not get any transformations to run. Finally got there following these steps:
1. ran 'yum install php-xslt'
2. This installed 'xslt.so' to usr/lib/php4 and other dependencies.
3. Add 'dl('xslt.so');' to the top of your php files you want to perform a translation in. e.g.
dl('xslt.so');
// Allocate a new XSLT processor
$xh = xslt_create();
// Process the document, returning the result into the $result variable
$result = xslt_process($xh, 'test.xml', 'test.xsl');
// Output to browser
echo $result;


matthias-at-mlienau.de

For those guys who mess up with compiling the current Sablotron 0.95 sources from gingerall.com:
Here is a patch which corrects a typo.
Or - go to src/engine/domprovider.cpp and change "voiD" to "void" in line 558 and compile again...
*** domprovider.cpp.diff        Thu Aug 29 23:32:59 2002
--- domprovider.cpp     Thu Aug 29 23:32:14 2002
***************
*** 555,561 ****
   if (external) cdelete(external);
 }
 
! void DOMProviderUniversal::setExtProvider(DOMHandler *domh, voiD *data)
 {
   if (external) cdelete(external);
   if (domh)
--- 555,561 ----
   if (external) cdelete(external);
 }
 
! void DOMProviderUniversal::setExtProvider(DOMHandler *domh, void *data)
 {
   if (external) cdelete(external);
   if (domh)


maximo

COMPILING AND INSTALLING SABLOTRON AND EXPAT FOR PHP ON A FREEBSD iServer
0) Prepare your virtual server environment.  Telnet to your iserver and type:
mkdir -p ~/usr/local/apache/1.3/bin
ln /usr/bin/make ~/usr/bin/make
ln /usr/local/apache/1.3/bin/apxs ~/usr/local/apache/1.3/bin/apxs
ln /usr/local/apache/1.3/bin/httpd ~/usr/local/apache/1.3/bin/httpd
1) download the following files:
expat-1.95.tar.gz - http://expat.sourceforge.com
Sablot-0.52.tar.gz - http://www.gingerall.com
php4-latest.tar.gz - http://snaps.php.net
2) copy these files to ~/usr/local
3) expand all these files uing tar -xvzf
4) go into expat directory and type:
./configure --prefix=/usr/home/your_iserver_login_name/usr/local
make
make install

  the files will be installed under ~/usr/local/lib and ~/usr/local/include
5) set the following environment variables:
setenv LD_LIBRARY_PATH /usr/home/your_iserver_login_name/usr/local/lib
setenv LD_RUN_PATH /usr/home/your_iserver_login_name/usr/local/
setenv CPLUS_INCLUDE_PATH /usr/home/your_iserver_login_name/usr/local/include
setenv LIBRARY_PATH /usr/home/your_iserver_login_name/usr/local/lib
6) go into the Sablotron directory and type:
./configure --prefix=/usr/home/your_iserver_login_name/usr/local
make
make install
7) go into the php directory and type:
./configure --with-apxs=/usr/local/apache/1.3/bin/apxs \
--disable-debug \
--enable-trans-sid \
--enable-versioning \
--enable-ftp \
--with-mysql=/usr/home/your_iserver_login_name/usr/local/mysql \
--with-xml \
--enable-magic-quotes \
--enable-track-vars \
--enable-sablot-errors-descriptive \
--with-sablot=/usr/home/your_iserver_login_name/usr/local \
--with-expat=/usr/home/your_iserver_login_name/usr/local
then
make
and
make install
the final command - make install - should give an error about not being able to install pear.
This is normal, as pear tries to copy itself outside of your virtual server space.  Since pear
is not an essential part of PHP - you can ignore this. (maybe there is a command for ./configure
in php that allows us to specify the directory in which pear will be installed?
8) final steps:
  go to ~/usr/local/etc/httpd/conf
  edit httpd.conf
  comment out the LoadModule directive for the previous php .so module.
  not that you should see the new module you just compile already inserted in the httpd.conf as
  the last line of all LoadModule directives. (it should be called libphp4.so
  now just go back to the command prompt after you have edited httpd.conf and type:
  restart_apache
  now go to your httpd document root (usually htdocs), and create a php file with the following
  code in it:
  <?php
    phpinfo();
  ?>
  load the file in your browser, and you should see that everything has been installed properly :)


aargh

Compilation on RedHat 7.0 PHP-4.1.2-7.0.4.
Compilation failed when providing --enable-xslt --with-xslt-sablot --with-sablot-js.
Problem was that an additonal flag needed to be specified or the build would fail complaining that js-libs ... could not be found.
LIBS="-lttf -lpng -ljpeg -lz -lnsl -ljs"; export LIBS
The additional flag "-ljs" needed to be set.


dennisnospam

Building Sablotron on Solaris with.
gcc 3.0.3 and native linker
libtool (sunfreeware)
apache 1.3.24
php-4.2.1
sablotron-0.90
expat-1.95.2
When configuring Apache you might experience this error..
libsablot.so: undefined reference to `operator new[](unsigned)'
libsablot.so: undefined reference to `__cxa_call_unexpected'
libsablot.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
libsablot.so: undefined reference to `operator delete(void*)'
libsablot.so: undefined reference to `__gxx_personality_v0'
libsablot.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'
libsablot.so: undefined reference to `operator delete[](void*)'
libsablot.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'
libsablot.so: undefined reference to `operator new(unsigned)'
To cure it make sure that during the configure stage you feed configure LDFLAGS variable like so.
LDFLAGS=' -lstdc++' ./configure
Otherwise Apache's compiler sanity check will balk.


roman

bat at flurf, you said that Sablotron implements XSLT 1.1, but according to its makers, "Sablotron is ...implementing XSLT 1.0, DOM Level2 and XPath 1.0" [http://www.gingerall.org/sablotron.html]

will

As an update to the previous advice about the undefined references problem when installing PHP with Sablotron, PHP 4.3.4 has a new EXTRA_LDFLAGS_PROGRAM line added to the Makefile. Make sure to add -lstdc++ to this line as well as the EXTRA_LDFLAGS line.

crtn

Another way to get around the EXPAT-SABLOTRON problems (seg faults) is supposedly to recompile apache with:
--disable-rule=EXPAT


d dot u

... addition to last message
sorry shanx (miss-spelled).
having a full example you must call it like in the shanx-example. Hint dont use echo inside of <php:eval> but return, because it is only string concatenation.
<code>
<?php
##  require "xslt.inc.php";
$xslt = new xsltTransform("life.xsl", "life.xml");
print ($xslt->applyTransformation());
?>
</code>


Change Language


Follow Navioo On Twitter
.NET Functions
Apache-specific Functions
Alternative PHP Cache
Advanced PHP debugger
Array Functions
Aspell functions [deprecated]
BBCode Functions
BCMath Arbitrary Precision Mathematics Functions
PHP bytecode Compiler
Bzip2 Compression Functions
Calendar Functions
CCVS API Functions [deprecated]
Class/Object Functions
Classkit Functions
ClibPDF Functions [deprecated]
COM and .Net (Windows)
Crack Functions
Character Type Functions
CURL
Cybercash Payment Functions
Credit Mutuel CyberMUT functions
Cyrus IMAP administration Functions
Date and Time Functions
DB++ Functions
Database (dbm-style) Abstraction Layer Functions
dBase Functions
DBM Functions [deprecated]
dbx Functions
Direct IO Functions
Directory Functions
DOM Functions
DOM XML Functions
enchant Functions
Error Handling and Logging Functions
Exif Functions
Expect Functions
File Alteration Monitor Functions
Forms Data Format Functions
Fileinfo Functions
filePro Functions
Filesystem Functions
Filter Functions
Firebird/InterBase Functions
Firebird/Interbase Functions (PDO_FIREBIRD)
FriBiDi Functions
FrontBase Functions
FTP Functions
Function Handling Functions
GeoIP Functions
Gettext Functions
GMP Functions
gnupg Functions
Net_Gopher
Haru PDF Functions
hash Functions
HTTP
Hyperwave Functions
Hyperwave API Functions
i18n Functions
IBM Functions (PDO_IBM)
IBM DB2
iconv Functions
ID3 Functions
IIS Administration Functions
Image Functions
Imagick Image Library
IMAP
Informix Functions
Informix Functions (PDO_INFORMIX)
Ingres II Functions
IRC Gateway Functions
PHP / Java Integration
JSON Functions
KADM5
LDAP Functions
libxml Functions
Lotus Notes Functions
LZF Functions
Mail Functions
Mailparse Functions
Mathematical Functions
MaxDB PHP Extension
MCAL Functions
Mcrypt Encryption Functions
MCVE (Monetra) Payment Functions
Memcache Functions
Mhash Functions
Mimetype Functions
Ming functions for Flash
Miscellaneous Functions
mnoGoSearch Functions
Microsoft SQL Server Functions
Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
Mohawk Software Session Handler Functions
mSQL Functions
Multibyte String Functions
muscat Functions
MySQL Functions
MySQL Functions (PDO_MYSQL)
MySQL Improved Extension
Ncurses Terminal Screen Control Functions
Network Functions
Newt Functions
NSAPI-specific Functions
Object Aggregation/Composition Functions
Object property and method call overloading
Oracle Functions
ODBC Functions (Unified)
ODBC and DB2 Functions (PDO_ODBC)
oggvorbis
OpenAL Audio Bindings
OpenSSL Functions
Oracle Functions [deprecated]
Oracle Functions (PDO_OCI)
Output Control Functions
Ovrimos SQL Functions
Paradox File Access
Parsekit Functions
Process Control Functions
Regular Expression Functions (Perl-Compatible)
PDF Functions
PDO Functions
Phar archive stream and classes
PHP Options&Information
POSIX Functions
Regular Expression Functions (POSIX Extended)
PostgreSQL Functions
PostgreSQL Functions (PDO_PGSQL)
Printer Functions
Program Execution Functions
PostScript document creation
Pspell Functions
qtdom Functions
Radius
Rar Functions
GNU Readline
GNU Recode Functions
RPM Header Reading Functions
runkit Functions
SAM - Simple Asynchronous Messaging
Satellite CORBA client extension [deprecated]
SCA Functions
SDO Functions
SDO XML Data Access Service Functions
SDO Relational Data Access Service Functions
Semaphore
SESAM Database Functions
PostgreSQL Session Save Handler
Session Handling Functions
Shared Memory Functions
SimpleXML functions
SNMP Functions
SOAP Functions
Socket Functions
Standard PHP Library (SPL) Functions
SQLite Functions
SQLite Functions (PDO_SQLITE)
Secure Shell2 Functions
Statistics Functions
Stream Functions
String Functions
Subversion Functions
Shockwave Flash Functions
Swish Functions
Sybase Functions
TCP Wrappers Functions
Tidy Functions
Tokenizer Functions
Unicode Functions
URL Functions
Variable Handling Functions
Verisign Payflow Pro Functions
vpopmail Functions
W32api Functions
WDDX Functions
win32ps Functions
win32service Functions
xattr Functions
xdiff Functions
XML Parser Functions
XML-RPC Functions
XMLReader functions
XMLWriter Functions
XSL functions
XSLT Functions
YAZ Functions
YP/NIS Functions
Zip File Functions
Zlib Compression Functions
eXTReMe Tracker