Php xsltProcessor setParameter:发送未定义数量的参数
我有一个XSL文件 我有一个PHP文件,其中包含一个名为Php xsltProcessor setParameter:发送未定义数量的参数,php,xslt,parameters,Php,Xslt,Parameters,我有一个XSL文件 我有一个PHP文件,其中包含一个名为$bob的XSLT处理器 我想向xsl转换发送一些参数 所以,我把它写在我的PHP文件中;例如: $bob->setParameter('', 'message', 'hi'); <xsl:param name="message" /> 在我的XSL文件中,为了获取参数,我编写了以下示例: $bob->setParameter('', 'message', 'hi'); <xsl:param name="
$bob
的XSLT处理器
我想向xsl转换发送一些参数
所以,我把它写在我的PHP文件中;例如:
$bob->setParameter('', 'message', 'hi');
<xsl:param name="message" />
在我的XSL文件中,为了获取参数,我编写了以下示例:
$bob->setParameter('', 'message', 'hi');
<xsl:param name="message" />
以下是我的XSL的简化版本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="xml"
indent="yes"
encoding="UTF-8"
/>
<xsl:param name="titre" />
<xsl:param name="motscles" />
<xsl:template match="posts" >
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="@*|node()"/>
<xsl:call-template name="post" />
</xsl:copy>
</xsl:template>
<!-- Template de post -->
<xsl:template name="post" >
<post id="{$id}" >
<titre><xsl:value-of select="$titre" /></titre>
<motscles>
</motscles>
</post>
</xsl:template>
<!-- Copier les nodes et attributs récursivement -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
PHP中的连接如何
$bob->setParameter("", "message", "Hi:it's bob:How are you ?");
XSLT代码中的符号化和标记化:
<messages>
<xsl:for-each select="tokenize($message,':')">
<message>
<xsl:value-of select="." />
</message>
</xsl:for-each>
</messages>
我们为您的消息确定一个分隔符(即确保消息中不会出现的字符),然后传入一个字符串,消息由该字符分隔,例如,如果您选择
则传入$bob->setParameter(“'message'”,“您好,我是bob,|您好?”)
,然后在要与libxslt一起使用的XSLT代码中使用,例如
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:str="http://exslt.org/strings"
exclude-result-prefixes="str">
<xsl:param name="message"/>
<xsl:variable name="msgs-rtf">
<messages>
<xsl:for-each select="str:tokenize($message, '|')">
<message>
<xsl:value-of select="."/>
</message>
</xsl:for-each>
</messages>
</xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="$msgs-rtf"/>
</xsl:template>
</xsl:stylesheet>
据我所知,PHP5用于XSLT的libxslt支持扩展函数str:tokenize
,所以您应该能够使用它。或者您需要编写一个在XSLT本身中进行标记化的模板,我只有一个参数,那就是XML文档。在调用转换之前,我将创建这个XML文档
与发送单个以管道分隔的字符串相比,这有一些definit好处:
您转换的原始XML是什么?您的XSLXML是什么?但是,由于
setParameter
只允许为每个名称设置一个值,因此不清楚您要做什么。原始的XML和XSL会让您了解更多。user1786510:您可能对一个比使用管道分隔字符串更灵活、更可扩展的解决方案感兴趣。也谢谢您!我立即尝试:)这是一个比使用管道分隔字符串更干净的解决方案,特别是XSLT 1.0不支持tokenize()函数。理论上,我同意传入XML文档更好,但根据PHP,libxslt不支持DOMDocument或节点参数。PHP使用的libxslt支持EXSLT标记化,因此我认为对于标记为PHP和XSLT的问题,我的答案是一个实用的选项。如果问题的发帖人所使用的XSLT处理器根本不起作用,那么建议一些更具可伸缩性、可扩展性和更干净的东西也无济于事。
$bob->setParameter("", "message", "Hi:it's bob:How are you ?");
<messages>
<xsl:for-each select="tokenize($message,':')">
<message>
<xsl:value-of select="." />
</message>
</xsl:for-each>
</messages>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:str="http://exslt.org/strings"
exclude-result-prefixes="str">
<xsl:param name="message"/>
<xsl:variable name="msgs-rtf">
<messages>
<xsl:for-each select="str:tokenize($message, '|')">
<message>
<xsl:value-of select="."/>
</message>
</xsl:for-each>
</messages>
</xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="$msgs-rtf"/>
</xsl:template>
</xsl:stylesheet>