XSLTProcessor::setParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::setParameter设置参数的值

描述

public XSLTProcessor::setParameter(string $namespace, string $name, string $value): bool
public XSLTProcessor::setParameter(string $namespace, array $options): bool

设置一个或多个参数的值,用于后续使用 XSLTProcessor 进行转换。如果样式表中不存在参数,则会忽略该参数。

参数

namespace

XSLT 参数的命名空间 URI。

name

XSLT 参数的本地名称。

value

XSLT 参数的新值。

options

一个包含 name => value 对的数组。

返回值

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

示例

示例 #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');
}

?>

参见

添加注释

用户贡献的注释 7 notes

Lennaert van der Linden
16 年前
如果值同时包含单引号和双引号,则不会设置参数。相反,在转换文档时将显示警告

PHP Warning: XSLTProcessor::transformToXml(): Cannot create XPath expression (string contains both quote and double-quotes)
richard at aggmedia dot net
15 年前
请注意,无法从 XSLTProcessor 中移除参数,除非您知道它的名称,并且没有办法(据我所知)获取当前参数的列表。

这意味着,除非您对每个参数调用 XSLTProcessor->removeParameter(),否则您无法重用具有不同参数的 XSLTProcessor,而要做到这一点,您需要知道所有当前设置的参数的名称。

我遇到这种情况是因为我们缓存了 XSLTProcessor 以供重用,而它们会根据虚假参数输出内容(它们来自之前的使用,仍然存在)。
brettz9
17 年前
似乎 heinemann 的用法不正确,并没有达到预期的效果。

此方法的目的是更改 XSL 样式表中的全局 <xsl:param> 值,而不是更改任何其他元素的属性。<xsl:param> 基本上允许您设置一个样式表,该样式表可以被外部(不需修改原始 XSL 文件)自定义(例如来自 PHP)。

以下是使用示例(有效)

样式表

<?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', "现在我已经覆盖了默认值!");
$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>' );
?>

输出

string(5) "

"
string(143) "<?xml version="1.0"?>
<p style="color:red;">打印参数: 现在我已经覆盖了默认值!</p>
"
string(32) "现在我已经覆盖了默认值!"
string(6) "

"

请注意,目前添加命名空间将不起作用。目前唯一的选择是将命名空间的第一个参数设置为空字符串(尽管您可以在第二个参数(名称)中添加冒号加前缀以设置命名空间前缀参数名称的参数)。

参见 http://bugs.php.net/bug.php?id=30622
OrionI
17 年前
经过进一步研究(参见 http://bugs.php.net/bug.php?id=41248),似乎是 libxslt 的缺陷,而不是 PHP,阻止将 DOMDocument 或 DOMNodes 作为参数传递。
Orion I
17 年前
我一直试图将 DOMDocument 对象作为参数传递,以便将大量数据填充到 XML 节点中,但似乎此函数无法实现。我希望它能像 .NET 2.0 框架中那样工作。(参见 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 似乎支持它(参见 http://xmlsoft.org/XSLT/html/libxslt-variables.html
#xsltParseGlobalParam),在 PHP 中也无法做到。

实际上,如果参数不完全符合预期,您将始终收到类似以下的警告

XSLTProcessor::setParameter() 的参数数量错误
Stoke A
19 年前
XSLTProcessor::removeParameter() 无法对通过 XSLTProcessor::setParameter(string namespace, array options) 在 5.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"
indent="yes"
encoding="ISO-8859-15"
doctype-system = "-//W3C//DTD XHTML 1.0 Transitional//EN"
doctype-public = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
<xsl:template match="docs">
<html>
<head>
<title>
<xsl:text>Example</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>Howto set xhtml Transitional Namespaces width php</block>
<block>see https://php.net</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