PHP Conference Japan 2024

XSLTProcessor::importStylesheet

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::importStylesheet导入样式表

描述

public XSLTProcessor::importStylesheet(对象 $stylesheet): 布尔值

此方法将样式表导入到XSLTProcessor 用于转换。

参数

stylesheet

作为DOMDocumentSimpleXMLElement 对象导入的样式表。

返回值

成功时返回 true,失败时返回 false

错误/异常

如果 stylesheet 不是 XML 对象,则抛出 TypeError 异常。

变更日志

版本 描述
8.4.0 现在如果 stylesheet 不是 XML 对象,则抛出 TypeError 异常,而不是 ValueError 异常。
添加注释

用户贡献的注释 5 条注释

kevin at metalaxe dot com
17 年前
仅供参考,截至撰写本文时,此函数不支持导入多个样式表。以下内容只会输出第二个导入的表的样式表转换

<?php

# 加载XML文件
$XML = new DOMDocument();
$XML->load( 'data.xml' );

# 开始XSLT
$xslt = new XSLTProcessor();

# 导入样式表1
$XSL = new DOMDocument();
$XSL->load( 'template1.xsl' );
$xslt->importStylesheet( $XSL );

# 导入样式表2
$XSL = new DOMDocument();
$XSL->load( 'template2.xsl' );
$xslt->importStylesheet( $XSL );

# 打印
print $xslt->transformToXML( $XML );
?>

这没有记录在案,非常令人失望。
bbrosseau at gmail
19 年前
对于那些想要使用外部文档的人来说,重要的是不要使用 DomDocument::loadXML,因为处理器将没有路径来查找其他文件

因此,如果您想使用预生成的样式表 $f 转换一些 xml

<?php
$f
= 'somestylesheet.xsl';
$xsl = DomDocument::loadXML(file_get_contents($f));
?>

document('other.xml') 将无法使用相对路径,而 <?php $xsl = DomDocument::load($f); ?> 将可以!
diesel at spbnet dot ru
17 年前
这不是问题。您可以设置 DOMDocument 的 documentURI 属性。
像这样

<?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);
?>

然后 document('other.xsl') 将正常工作!
fcartegnie
17 年前
PHP5 xsl 处理器的行为与 PHP4 的处理器的行为不同,使用了 CDATA 部分。(见 http://bugs.php.net/bug.php?id=29837
加载的 XSL 表的 CDATA 部分默认情况下不允许输出转义处理(CDATA 中的所有内容都默认转义)。

因此,在这种情况下,您不能以通常的方式构建您的 XSL Dom
$xsldom = DomDocument::loadXML(file_get_contents('sheet.xsl'));

并且必须通过这个(允许 LIBXML_NOCDATA 参数)
$xsldom = new DomDocument;
$xsldom->load('sheet.xsl', LIBXML_NOCDATA);

然后 CDATA 输出转义行为将是正确的。
rbmeo at yahoo dot com
12 年前
要使您的导入动态化,请尝试此代码

<?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());
?>

这段代码基本上加载主样式表,添加导入 xsl 代码,然后作为 xml 字符串重新加载,以便在 dom 中加载导入的样式表。
To Top