如何使用PHP将XPath表达式作为XSL参数传递? - php

我有一个很大的XML文件,可以从中提取信息并将其转换为其他XML格式。我的转换本身运行良好,所以现在我想通过使用PHP传递可变的select=""条件使其更加灵活。

以下是我正在使用的有效XSLT代码(为简单起见,将其截断):

<xsl:param name="criteria" select="//Product[PublicationDate &gt; 20141231]" />
<xsl:template match="ONIXMessage">
 <xsl:for-each select="$criteria">
  <xsl:apply-templates select="Title"/>
 </xsl:for-each>
</xsl:template>

$ criteria的值是一个XPath表达式,上面的方法可以正常工作。问题是当我尝试使用PHP将不同的值传递到$ criteria时:

$proc = new XSLTProcessor;
$proc->importStyleSheet( $icml );
$proc->setParameter( "", "criteria", "//Product[Imprint = 'Nightwood']");

当我使用setParameter时,转换完全失败。我知道表达式本身是正确的,因为当我将表达式直接输入XSLT(不使用PHP)时,transfrom可以正常工作。

据我了解,问题在于参数是作为字符串而不是作为正确的XPath表达式传递的,因此XSLT无法将select=""解析为节点集。那么我该如何防止呢?传递整个XPath表达式很重要,这样我就可以将for-each条件更改为所需的任何值。

参考方案

据我了解,问题在于参数正在
作为字符串而不是正确的XPath表达式传递

那是正确的评估。您需要一个可以将字符串作为XPath表达式求值的处理器。对您来说幸运的是,PHP使用的libxslt处理器确实支持EXSLT dyn:evaluate() extension function。

否则,您将必须将参数传递给另一个XSLT样式表,其功能是生成实际转换所需的XSLT样式表。

php:是否有充分的理由引用所有数组键/索引? - php

我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…

验证php中的javascript对象 - php

在我的用户界面中,用户可以构建一些javascript对象,例如:var box = { "width": "100px", "height": "200px", "click": function () { alert("You clicked t…

检查文件是否存在且大于 - php

我需要检查与脚本位于同一文件夹中的文件是否存在并且大于100字节,如果是,则回显“是否存在”。 参考方案 我相信您正在尝试执行以下操作:$filename = 'test.txt'; if (file_exists($filename) && filesize($filename) > 100) { echo �…

php fopen相对路径断开-神秘 - php

我知道“必须进行某些更改”,但是我的代码似乎整夜无故中断。我的服务器目录结构是这样的: / /脚本 /审计 /其他事情我在“脚本”文件夹中有一个脚本(假设它被称为“ /scripts/MyScript.php”),该脚本使用curl收集网页中的数据,并将其日期过的副本保存在“审核”文件夹中。要写入审核文件夹,我使用了 $ fh = fopen(“ ./ au…

当文本等于单选按钮的值时,选择单选按钮 - php

当下拉菜单中的文本等于值时,是否可以选择2个名称相同但值不同的单选按钮中的1个?https://paste.ee/p/2iCjA第97行我用if-else尝试过:if($('input[name="anrede"]').val() == 'Herr') { $("#Herr").…