我有一个XSL文件。
我有一个名为$bob
的XSLTProcessor的PHP文件。
我想向我的xsl转换发送一些参数。
所以,我在我的PHP文件中写这个;例如:
$bob->setParameter('', 'message', 'hi');
在我的XSL文件中,为了获取参数,我写了这个例子:
<xsl:param name="message" />
如果我想在我的XSL中显示这个参数,我会这样做:
<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表单获取了帖子(titre,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>
答案 0 :(得分:2)
我只有一个参数,即XML文档。我会在调用转换之前创建这个XML文档。
与发送单个管道分隔的字符串相比,这有一些明确的好处:
每个参数都在自己的元素中,这可以通过XSLT中的单独模板进行匹配。
不需要对管道分隔的字符串进行递归处理,也不需要扩展函数。
更具可扩展性和可扩展性。
答案 1 :(得分: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>
据我所知,libxslt支持扩展函数str:tokenize
,PHP 5用于XSLT,因此您应该可以使用它。或者您需要编写一个在XSLT中进行标记化的模板
答案 2 :(得分:0)
如何在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>