gpt4 book ai didi

php - xsltProcessor setParameter : send an undefined number of params

转载 作者:行者123 更新时间:2023-12-04 05:25:52 27 4
gpt4 key购买 nike

我有一个 XSL 文件。

我有一个带有 XSLTProcessor 的 PHP 文件,名为 $bob .

我想向我的 xsl 转换发送一些参数。

所以,我把它写在我的 PHP 文件中;例如:

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

在我的 XSL 文件中,为了获取参数,我写了这样的例子:
<xsl:param name="message" />

如果我想在我的 XSL 中显示这个参数,我这样做:
<xsl:value-of select="$message" />

问题来了。

我必须向我的 XSL 发送未定义数量的参数,但我不知道该怎么做。我尝试了几种解决方案,但它们并不相关。我想向我的 XSL 发送例如 3 条消息,并且我希望我的 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 表单获取了帖子的信息(标题、花絮)。
所以我的 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>

最佳答案

确定消息的分隔符(即确保不会出现在消息中的字符),然后传入一个字符串,其中消息由该字符分隔,例如如果您选择 |你传入$bob->setParameter('', 'message', "Hi|It's Bob|How are you?"); ,然后在要与 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>

据我所知,扩展函数 str:tokenize在 PHP 5 用于 XSLT 的 libxslt 中受支持,因此您应该能够使用它。或者您需要编写一个模板来在 XSLT 本身中进行标记化

关于php - xsltProcessor setParameter : send an undefined number of params,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13218885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com