如何使用 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 样式表。
我有一个非常大的 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 样式表。