XSLTProcessor::importStylesheet()
(PHP 5, PHP 7)
Import stylesheet
说明
public XSLTProcessor::importStylesheet(object $stylesheet): bool
This method imports the stylesheet into the XSLTProcessor for transformations.
参数
- $stylesheet
The imported style sheet as a DOMDocument or SimpleXMLElement object.
返回值
成功时返回TRUE
,或者在失败时返回FALSE
。
更新日志
版本 | 说明 |
---|---|
5.2.8 | Accepts SimpleXMLElement again which was broken since PHP 5.2.6. |
Just for reference, as of this writing, this function does not support importing multiple stylesheets. The following will output only the stylesheet transformation of the second imported sheet: <?php # LOAD XML FILE $XML = new DOMDocument(); $XML->load( 'data.xml' ); # START XSLT $xslt = new XSLTProcessor(); # IMPORT STYLESHEET 1 $XSL = new DOMDocument(); $XSL->load( 'template1.xsl' ); $xslt->importStylesheet( $XSL ); #IMPORT STYLESHEET 2 $XSL = new DOMDocument(); $XSL->load( 'template2.xsl' ); $xslt->importStylesheet( $XSL ); #PRINT print $xslt->transformToXML( $XML ); ?> This wasn't documented and quite dissapointing.
For those who wants to use external documents, it is important not to use the DomDocument::loadXML because the processor will not have the path to look for other files So if you want to transform some xml with a pre-generated stylesheet $f: <?php $f = 'somestylesheet.xsl'; $xsl = DomDocument::loadXML(file_get_contents($f)); ?> document('other.xml') will not work with relative path and <?php $xsl = DomDocument::load($f); ?> will!
This is not a problem. You may set DOMDocument's documentURI property. Something like this <?php $xsl = new DOMDocument('1.0','UTF-8'); $xsl->loadXML(file_get_contents('/foo/bar/somefile.xsl'); $xsl->documentURI = '/foo/bar/somefile.xsl'; $xslProc = new XSLTProcessor(); $xslProc->importStylesheet($xsl); ?> and document('other.xsl') will work fine!
PHP5 xsl processor has a different behaviour than PHP4's one with CDATA sections. (see http://bugs.php.net/bug.php?id=29837) Loaded XSL sheet CDATA sections does not allow, by default, output-escaping handling (everything in the CDATA is escaped by default). So in this case you can't build your XSL Dom the usual way: $xsldom = DomDocument::loadXML(file_get_contents('sheet.xsl')); and must go through this one (allowing LIBXML_NOCDATA parameter): $xsldom = new DomDocument; $xsldom->load('sheet.xsl', LIBXML_NOCDATA); Then the CDATA output-escaping behaviour will be correct.
To make your import dynamic, try this code: <?php $dom = new DOMDocument(); $dom->load('main.xsl'); $xpath = new DomXPath($dom); $importnode= $questionsXsl->createElement('xsl:include'); $attr= $questionsXsl->createAttribute('href'); $attr->value = 'import.xsl'; $importnode->appendChild($attr); $dom->documentElement->insertBefore($importnode,$ref); $dom->loadXml($dom->saveXml()); ?> this code basically loads the main stylesheet, prepend the import xsl code then reload as xml string so the imported stylesheet will be loaded at dom.