1

私はこれと似たような質問を見てきましたが、これとまったく同じではありませんが、これが私がやろうとしていることです。SMSからXMLを取得し、そこからPDFログを作成します。よく働く。この新しい要素を追加しようとしましたが、XSLTの「置換」機能で文字を置換するようになりましたが、代わりに、変数を使用して外部グラフィックを配置したいと思います。XSLT変数の内容をFOドキュメントに直接貼り付けると、問題なくPDFが生成されますが、タグと内容がFOファイルに渡されません。簡単なものが欠けていると思います。

XMLスニペット:

<?xml version="1.0" encoding="UTF-8"?>
<SMSExport>
    <SMSMessage>
        <Kind>Sent</Kind>
        <DateTime>2011-11-08 12:14:23 -0800</DateTime>
        <Name>Sendee's name</Name>
        <Number>+15553009008</Number>
        <Message>Yay!!!  - &lt;/Message>
    </SMSMessage>
</SMSExport>

XMLスニペット:

<xsl:if test="not(following-sibling::Message/@File)">
    <!-- Needs rework!!!  "Graphic not taking -->
    <xsl:variable name="emoji">
        <fo:external-graphic src="emoji/emoji-E057.png"
            content-height=".15in"/>
    </xsl:variable>
        <!-- Repeat added, to show a string replace works -->
    <xsl:value-of select="replace(following-sibling::Message, '', ';-)')"/>
        <fo:block/>
    <xsl:value-of select="replace(following-sibling::Message, '',$emoji)"/>
</xsl:if>

結果のFOブロックスニペットを次のように表示します。

<fo:block start-indent=".35in" end-indent=".25in" keep-with-next="always">
    Yay!!! ;-) - ;-);-);-)
        <fo:block/>
    Yay!!!  -
</fo:block>

前もって感謝します!

追加:(LarsHの回答を使用して、再帰を処理した方法を次に示します。他の誰かに役立つことを願っています。

文字列を再帰的に処理するために、新しい正規表現を使用して上のブロックに貼り付け続けました。これは分析の個別のインスタンスを配置していたので、新しいアイテムを置き換えるたびに、行を繰り返し続けました。つまり、3つのブロックで、3つのアイテム(X、Y、Z)を検索します。

This is the result of (x.gif)YZ.
This is the result of X(y.gif)Z.
This is the result of XY(z.gif).

私が欲しかったものの代わりに、それは:

This is the result of (x.gif)(y.gif)(z.gif).

他の人にとっては、これを処理するには、一致しないものを置き換えるだけです

<xsl:copy-of select="."/>

次のanalyzeブロックをネストした行(この例では、空のボックスを避けるために、絵文字を16進値に置き換えました)。ここでは2つのアイテム/レベルに対してのみ実行しましたが、ネストを続行するだけで、うまく機能します。

<xsl:analyze-string select="following-sibling::Message" regex="&#xE057;">
    <xsl:matching-substring>
        <xsl:copy-of select="$E057"/>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
        <xsl:analyze-string select="." regex="&#xE120">
            <xsl:matching-substring>
                <xsl:copy-of select="$E120"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:copy-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
     </xsl:non-matching-substring>
</xsl:analyze-string>
4

2 に答える 2

3

このreplace()関数は、パターンの出現を文字列に置き換えます。の文字列値$emojiは、そのテキストノードの連結です。つまり、空の文字列です。言い換えれば、replace()あなたが必要なことをすることはできません。

質問は要約すると、文字列内の文字(またはパターン)をXMLフラグメントに置き換えるにはどうすればよいですか?

良い解決策はxsl:analyze-string、パターン''の出現を次の完全な構造化コンテンツに置き換えるために使用することです$emoji

<xsl:analyze-string select="following-sibling::Message" regex="">
  <xsl:matching-substring>
    <xsl:copy-of select="$emoji" />
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

<xsl:value-of>テキストのみを出力できる、を使用する代わりに。

于 2011-12-05T23:21:37.553 に答える
0

XSLT 2.0を使用している場合、文字コード表を使用すると、必要な操作を簡単に実行できます。XSLT 2.0仕様の関連セクションには、特定の文字にHTMLimg要素を提供することを含む例があります。

于 2013-06-20T02:29:07.387 に答える