2011-12-05 12 views
1

私はこれと似たような質問をしてきましたが、ここでは私がやろうとしていることがあります。私は自分の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="&#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> 

答えて

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>を使用して、その出力のみテキストをすることができます。

+0

ありがとうございます。これは完全に機能しました。唯一の課題は、文字列に対して再帰的にそれを行う方法を理解することでした。私はコメントとしてそれを適合させることはできませんので、別の答えとしてそれを置くでしょう。 – LOlliffe

+0

@LOlliffe:同じ文字列内の異なる文字を異なるサブツリーに置き換える必要がありますか?おそらく ''の中では、テスト時の選択を使用するでしょう。しかし、あなたは既に解決策を見つけたようです。 :-) – LarsH

+0

@LOlliffe:前のコメントを明確にするために、私は ' 'の正規表現属性に代替文字を入れることを意味しました。 'regex =" [&#xE057;&#xE120;] "'、既に述べたように ''を使用してください。この方法の利点は、再帰の深さが厳密に制限されていることです。しかし、あなたの方法(別のxsl:analyze-stringをxsl:non-matching-substringの中に埋め込む)もうまくいきます。 – LarsH

0

XSLT 2.0を使用している場合は、文字マップを使用すると簡単に目的を達成できます。 relevant section of the XSLT 2.0 specには、特定の文字のHTML img要素を提供する例があります。

関連する問題