我有一个非常大的 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)时,转换工作得很好。
据我了解,问题在于参数作为字符串传递,而不是作为正确的 XPath 表达式传递,因此 XSLT 无法解析select=""
到一个节点集。那么我该如何防止这种情况发生呢?传递整个 XPath 表达式非常重要,这样我就可以将 for-each 标准更改为我想要的任何内容。
据我了解,问题在于该参数正在
作为字符串而不是作为正确的 XPath 表达式传递
这是一个正确的评价。您需要一个可以将字符串计算为 XPath 表达式的处理器。幸运的是,PHP 使用的 libxslt 处理器确实支持EXSLT dyn:evaluate() 扩展函数 http://exslt.org/dyn/functions/evaluate/index.html.
如果没有这个,您必须将参数传递给另一个 XSLT 样式表,其功能是生成实际转换所需的 XSLT 样式表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)