将字符串作为参数传递给PHP中的XSLT

时间:2015-04-16 05:27:32

标签: php xml string xslt xpath

我有一个关于将参数从PHP代码传递到xslt的问题。 这是我的PHP代码:

$searchStr = 'article[@key = 'journals/acta/Saxena96']';
$xsltProcessor = new XSLTProcessor();
$xsltProcessor->registerPHPFunctions();
$xsltProcessor->importStyleSheet($this->xslDoc);
$xsltProcessor->setParameter('', 'search_condition', $searchStr);

这是XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="dblp">
        <form> 
        <table border="1">
            <tr bgcolor="#9acd32">
                <th style="text-align:left">Auteur</th>
                <th style="text-align:left">Titre</th>
                <th style="text-align:left">Pages</th>
                <th style="text-align:left">Volumne</th>
                <th style="text-align:left">Journal</th>
                <th style="text-align:left">Numéro</th>
                <th style="text-align:left">URL</th>
                <th style="text-align:left">EE</th>
                <th style="text-align:left">Modification</th>
            </tr>
            <xsl:for-each select="$search_condition">
                <tr>
                    <td>
                        <xsl:value-of select="author/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="title/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="pages/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="volume/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="journal/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="number/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="url/text()"/>
                    </td>
                    <td>
                        <xsl:value-of select="ee/text()"/>
                    </td>
                    <td>

                    </td>
                </tr>
            </xsl:for-each>
        </table>  
        </form> 
    </xsl:template>
</xsl:stylesheet>

当我运行它时,我总是有错误消息:

  

警告:XSLTProcessor :: transformToXml():运行时错误:文件   file:/// D:/includes/xslt/article.xsl第31行for-each in   第67行的D:\ includes \ bean \ articles.php

     

警告:XSLTProcessor :: transformToXml():'select'表达式   不评估节点集。在D:\ includes \ bean \ articles.php上   67

但是当我直接输入字符串条件:'article [@key ='journals / acta / Saxena96']'进入xslt时,它运行良好。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

您必须在stylesheet级别定义参数:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:param name="search_condition">defaultValue</xsl:param>

...
</xsl:stylesheet>

您尝试将字符串作为for-each中的XPath表达式进行迭代。 这不行。它将被视为字符串文字。

可能的解决方案是eXSLT dyn:evaluate