XSLTProcessor中的setParameter:发送则params的未定义数量(xsltPr

2019-07-03 13:14发布

我有一个XSL文件。

我有一个XSLTProcessor中命名的PHP文件$bob

我想送我的XSL转换的一些参数。

所以,在我的PHP文件中写入这一点; 例如 :

$bob->setParameter('', 'message', 'hi');

在我的XSL文件,以获取参数,我写这篇文章,例如:

<xsl:param name="message" />

如果我想在我的XSL来显示这个PARAM,我这样做:

<xsl:value-of select="$message" />

这里谈到的问题。

我要送我的XSL的参数未定义的号码,我不知道该怎么做。 我尝试了几种解决方案,但他们是不相关的。 我想3条消息发送,例如我的XSL,我希望我的XSL使用它们来产生这样的代码:

<messages>
    <message>Hi</message>
    <message>it's bob</message>
    <message>How are you ?</message>
</messages>

你有我一个解决方案? 这将是非常好的。 很抱歉,如果我的英语错误。 谢谢你,有一个美好的一天。

至于问,这里是我有什么,我想有

(下文中被分离)

这是我原来的XML命名posts.xml的简化版本:

<posts>
    <post id="post1" >
        <titre>Hey</titre>
        <motscles>
            <motcle>Batman</motcle>
            <motcle>Cats</motcle>
        </motscles>
    </posts>
</posts>

这是我想在最后的XML:

<posts>
    <post id="post1" >
        <titre>Hey</titre>
        <motscles>
            <motcle>Batman</motcle>
            <motcle>Cats</motcle>
        </motscles>
    </posts>
    <post id="post2" >
        <titre>Toto</titre>
        <motscles>
            <motcle>Superman</motcle>
            <motcle>Dogs</motcle>
            <motcle>Cake</motcle>
        </motscles>
    </posts>
</posts>

我通过HTML形式获得交(滴度,motscles)的信息。 所以,我的PHP文件获取信息,并将其发送给我的XSL文件:

// initialize xml and xsl
$xml = new DOMDocument();
$xml->load('posts.xml');
$xsl = new DOMDocument();
$xsl->load('addpost.xsl');

// Initialize the XSLTProcessor
$addPost  = new XSLTProcessor();
$addPost->importStylesheet($xsl);

// Define parameters
$addPost->setParameter('', 'titre', $_POST['titre']);

// Get the modified xml
$xml = $addPost->transformToDoc($xml);

// Save the modified xml
$xml->save('posts.xml');

这里是我的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>

Answer 1:

那么决定为你的消息的分隔符(即保证不会在消息出现的字符),然后通过与由字符例如,如果你选择分开消息字符串| 你通过在$bob->setParameter('', 'message', "Hi|It's Bob|How are you?"); ,然后在你的XSLT代码与使用的libxslt例如使用

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

据我知道,扩展功能str:tokenize是在PHP 5使用了XSLT,所以你应该能够使用它支持的libxslt。 或者你需要写一个模板,做标记化的XSLT本身



Answer 2:

我只想有一个参数,即一个XML文档 。 之前我调用转换我想创建这个XML文档。

这相比于发送单一,管道分隔字符串一些definit好处

  1. 每一个参数是在自己的元素,这可以通过在XSLT一个单独的模板进行匹配。

  2. 需要一个管道分隔字符串,并没有扩展功能的无递归处理。

  3. 更多的可扩展性和可扩展性。



Answer 3:

如何在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>


文章来源: xsltProcessor setParameter : send an undefined number of params