我有一个非常大的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标准更改为我想要的任何标准。
答案 0 :(得分:1)
据我所知,问题在于参数正在存在 传递为字符串而不是正确的XPath表达式
这是一个正确的评估。您需要一个可以将字符串计算为XPath表达式的处理器。幸运的是,PHP使用的libxslt处理器确实支持EXSLT dyn:evaluate() extension function。
如果没有这个,你必须将参数传递给另一个XSLT样式表,其功能是生成实际变换所需的XSLT样式。