Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php xsltProcessor setParameter:发送未定义数量的参数_Php_Xslt_Parameters - Fatal编程技术网

Php xsltProcessor setParameter:发送未定义数量的参数

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="

我有一个XSL文件

我有一个PHP文件,其中包含一个名为
$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好处

  • 每个参数都在自己的元素中,可以通过XSLT中的单独模板进行匹配

  • 不需要对管道分隔字符串进行递归处理,也不需要扩展函数

  • 更具可扩展性和可扩展性


  • 您转换的原始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>