私はこれと似たような質問をしてきましたが、ここでは私がやろうとしていることがあります。私は自分のSMSからXMLを取得し、そこからPDFログを作成します。よく働く。この新しい要素を追加しようとしましたが、文字を置き換えるXSLTの「置き換え」機能を使用しましたが、代わりに変数を使用して外部グラフィックを挿入します。自分のXSLT変数の内容をFOドキュメントに直接貼り付けると、問題なくPDFが生成されますが、FOファイルにタグや内容が表示されません。私は単純なものを見逃していると思います。XSLT/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!!! - </Message>
</SMSMessage>
</SMSExport>
XMLスニペット:事前に
<fo:block start-indent=".35in" end-indent=".25in" keep-with-next="always">
Yay!!! ;-) - ;-);-);-)
<fo:block/>
Yay!!! -
</fo:block>
ありがとう:
<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ブロックスニペットを与えます!
ADDITION:(LarsHの答えを使用しては、ここで私は再帰を取り扱う方法です、それは他の誰かを助けるかもしれないホープ
再帰的に文字列上で動作するように、私は新しい正規表現で、上記ブロックに貼り付けを保ったこの。。。分析の別々のインスタンスを入れて、私はラインを交換し、それぞれの新しいアイテムで、繰り返し取得保管されたことは、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).
0123他人のために
、これを処理するために、単純に次の入れ子にブロックを分析し、非マッチング
<xsl:copy-of select="."/>
ラインを交換する(私は避けるために、それの進値で、絵文字の文字をも置換しましたこの例では空のボックス)。私はここでしか/レベル2つの項目のためにそれをやった、あなただけのネストを続けるだろうし、それは素晴らしい作品:
<xsl:analyze-string select="following-sibling::Message" regex="">
<xsl:matching-substring>
<xsl:copy-of select="$E057"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:analyze-string select="." regex="">
<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>
ありがとうございます。これは完全に機能しました。唯一の課題は、文字列に対して再帰的にそれを行う方法を理解することでした。私はコメントとしてそれを適合させることはできませんので、別の答えとしてそれを置くでしょう。 – LOlliffe
@LOlliffe:同じ文字列内の異なる文字を異なるサブツリーに置き換える必要がありますか?おそらく ''の中では、テスト時の選択を使用するでしょう。しかし、あなたは既に解決策を見つけたようです。 :-) –
LarsH
@LOlliffe:前のコメントを明確にするために、私は ' 'の正規表現属性に代替文字を入れることを意味しました。 'regex =" [&#xE057;&#xE120;] "'、既に述べたように ''を使用してください。この方法の利点は、再帰の深さが厳密に制限されていることです。しかし、あなたの方法(別のxsl:analyze-stringをxsl:non-matching-substringの中に埋め込む)もうまくいきます。 –
LarsH