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

时间:2015-01-05 05:41:44

标签: php xml xslt xpath

我有一个非常大的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标准更改为我想要的任何标准。

1 个答案:

答案 0 :(得分:1)

  

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

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

如果没有这个,你必须将参数传递给另一个XSLT样式表,其功能是生成实际变换所需的XSLT样式。

相关问题