2

XSLファイルがあります。

XSLTProcessorという名前のPHPファイルがあります$bob

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>

私のための解決策はありますか?とても素敵になります。私の英語に間違いがあったらごめんなさい。ありがとう、そして良い一日を。

尋ねられたように、これが私が持っているものと私が欲しいものです

(以下は別です)

これは、posts.xmlという名前の元の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>
4

3 に答える 3

2

1つのパラメーター、つまりXMLドキュメントがあります。変換を呼び出す前に、このXMLドキュメントを作成します。

これには、パイプで区切られた単一の文字列を送信する場合と比較して、いくつかの明確な利点があります

  1. すべてのパラメーターは独自の要素にあり、これはXSLTの個別のテンプレートと一致させることができます。

  2. パイプ区切り文字列の再帰処理や拡張関数は必要ありません。

  3. より拡張性と拡張性。

于 2012-11-04T15:42:41.237 に答える
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自体でトークン化を行うテンプレートを作成する必要があります

于 2012-11-04T13:47:56.903 に答える
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>
于 2012-11-04T13:47:20.870 に答える