PHP Conference Japan 2024

XSLTProcessor::setParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::setParameter設定參數值

說明

public XSLTProcessor::setParameter(字串 $namespace, 字串 $name, 字串 $value): 布林值
公開 XSLTProcessor::setParameter(字串 $namespace, 陣列 $options): 布林值

設定一個或多個參數的值,以便在後續使用 XSLTProcessor 進行轉換時使用。如果樣式表中不存在該參數,則會被忽略。

參數

namespace(命名空間)

XSLT 參數的命名空間 URI。

name(名稱)

XSLT 參數的區域名稱。

value(值)

XSLT 參數的新值。

options(選項)

一個 name => value 的鍵值對陣列。

回傳值

成功時回傳 true,失敗則回傳 false

錯誤/例外

如果任何參數包含空位元組,則會擲出 ValueError

更新日誌

版本 說明
8.4.0 現在,如果任何參數包含空位元組,則會擲出 ValueError,而不是靜默地截斷。
8.4.0 現在可以設定包含單引號和雙引號的參數值。在 PHP 8.4.0 之前,這會導致警告。

範例

範例 #1 在轉換前更改擁有者

<?php

$collections
= array(
'Marc Rutkowski' => 'marc',
'Olivier Parmentier' => 'olivier'
);

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// 設定轉換器
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // 附加 XSL 規則

foreach ($collections as $name => $file) {
// 載入 XML 來源
$xml = new DOMDocument;
$xml->load('collection_' . $file . '.xml');

$proc->setParameter('', 'owner', $name);
$proc->transformToURI($xml, 'file:///tmp/' . $file . '.html');
}

?>

另請參閱

新增註釋

使用者提供的註釋 6 則註釋

1
Lennaert van der Linden
16 年前
[nielsdos 編輯:自 PHP 8.4.0 起已不再適用]

如果值同時包含單引號和雙引號,則參數將不會被設定。相反,在轉換文件時會顯示警告。

PHP 警告:XSLTProcessor::transformToXml():無法建立 XPath 表達式(字串同時包含單引號和雙引號)
2
richard at aggmedia dot net
15 年前
請注意,除非您知道參數的名稱,否則無法從 XSLTProcessor 中移除參數,而且(我找不到)任何方法可以取得目前參數的列表。

這表示您無法重複使用具有不同參數的 XSLTProcessor,除非您在每個參數上都呼叫 XSLTProcessor->removeParameter(),而要這樣做,您需要知道所有目前已設定參數的名稱。

我遇到這個問題是因為我們快取了 XSLTProcessor 以重複使用,而它們卻根據虛擬參數(它們仍然存在於先前使用中)輸出內容。
1
brettz9
17 年前
看來 heinemann 的用法不正確,並沒有達到預期的結果。

這個方法的目的是更改 XSL 樣式表中的全域 <xsl:param> 值,而不是更改任何其他元素的屬性。<xsl:param> 基本上允許您設定可從外部(例如從 PHP)自訂的樣式表(而無需修改原始 XSL 檔案)。

以下是一個用法範例(可以運作)

樣式表

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="print_something" select="defaultstring"/>
<xsl:template match="/mydoc">
<p style="color:red;">已列印參數:<xsl:value-of select="$print_something"/></p>
</xsl:template>
</xsl:stylesheet>

程式碼

<?php
$dom
= new DOMDocument();
$xsl = new XSLTProcessor;
$xsl->setParameter( '', 'print_something', "Now I've overridden the default!");
$style = realpath( "./my_stylesheet.xslt" );
$dom->load($style);
$xsl->importStyleSheet($dom);
$dom->loadXML('<mydoc></mydoc>');

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
htmlentities( $out, ENT_QUOTES, 'utf-8' ),
$xsl->getParameter('', 'print_something'),
'</pre>' );
?>

會得到

字串(5) "

"
字串(143) "<?xml version="1.0"?>
<p style="color:red;">Printed parameter: Now I've overridden the default!</p>
"
字串(32) "Now I've overridden the default!" (我已經覆寫了預設值!)
字串(6) "

"

請注意,目前新增命名空間將無法運作。目前的唯一選項是將命名空間的第一個參數設定為空字串(儘管您可以將帶有冒號的前綴新增到名稱的第二個參數,以便為帶有命名空間前綴的參數名稱設定參數)。

參見 http://bugs.php.net/bug.php?id=30622
0
OrionI
17 年前
在進一步研究之後(參見 http://bugs.php.net/bug.php?id=41248),似乎是 libxslt 的缺點,而不是 PHP 的缺點,導致無法將 DOMDocument 或 DOMNode 作為參數傳遞。
0
Orion I
17 年前
我一直試圖將 DOMDocument 物件作為參數傳遞,以便我可以將一堆數據塞進 XML 節點中,但似乎這個函式無法做到這一點。我希望它能像在 .NET 2.0 framework 中一樣運作。(參見 http://msdn2.microsoft.com/en-us/library/
system.xml.xsl.xsltargumentlist.addparam.aspx)
但在查看 PHP 5.2.1 原始碼 /php-5.2.1/ext/xsl/xsltprocessor.c 第 604-650 行之後,似乎即使 libxslt 支援它,也無法在 PHP 中這樣做(參見 http://xmlsoft.org/XSLT/html/libxslt-variables.html
#xsltParseGlobalParam)

事實上,如果參數不完全符合預期,您將始終收到如下警告

XSLTProcessor::setParameter() 的參數數量錯誤
-1
heinemann dot juergen at hjcms dot de
18 年前
運作方式範例。

<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
縮排 = "yes"
編碼 = "ISO-8859-15"
文件類型系統 = "-//W3C//DTD XHTML 1.0 Transitional//EN"
文件類型公開 = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
<xsl:template match="docs">
<html>
<head>
<title>
<xsl:text>範例</xsl:text>
</title>
</head>
<body>
<xsl:for-each select="block">
<div>
<xsl:value-of select="." />
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

------------------

<?php
$dom
= new DomDocument( '1.0', 'utf-8' );
$xsl = new XSLTProcessor;
$xsl->setParameter( 'block', 'xmlns', 'http://www.w3.org/1999/xhtml' );

$style = realpath( "./my_stylesheet.xslt" );
$dom->load( $style );
$xsl->importStyleSheet( $dom );

$dom->loadXML( '<docs>
<block>如何使用 PHP 設定 xhtml Transitional 命名空間</block>
<block>參考 https://php.dev.org.tw</block>
</docs>'
);

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
htmlentities( $out, ENT_QUOTES, 'utf-8' ),
$xsl->getParameter( 'block', 'xmlns' ),
$xsl->getParameter( 'docs', 'xmlns' ),
'</pre>' );

?>
To Top