PHP Conference Japan 2024

XSLTProcessor::importStylesheet

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::importStylesheet匯入樣式表

描述

public XSLTProcessor::importStylesheet(物件 $stylesheet): bool

此方法將樣式表匯入 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 處理器在 CDATA 區段方面與 PHP4 的處理器有不同的行為。(請參閱 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