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

How do I pass an XPath expression as an XSL param using PHP?

我有一个非常大的 XML 文件,我正在从中提取信息,并将其转换为不同的 XML 格式。我的转换本身运行完美,所以现在我想通过使用 PHP 传递变量 select="" 条件来使其更加灵活。

以下是我正在使用的工作 XSLT 代码(为简单起见被截断):

<xsl:param name="criteria" select="//Product[PublicationDate > 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 条件更改为我想要的任何内容。

From what I understand, the problem is that the parameter is being passed as a string rather than as a proper XPath expression

这是一个正确的评估。您需要一个可以将字符串计算为 XPath 表达式的处理器。幸运的是,PHP 使用的 libxslt 处理器支持 EXSLT dyn:evaluate() extension function.

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