2012-01-29 12 views
2

xsl:function仕様にjava関数を転置しようとしています。 この関数は、基本的に部分文字列の周囲にhtmlタグを配置します。 私は今問題にぶつかります:javaインラインコードを使用すると、これは完全に動作しますが、xsl:関数を使用すると、出力エスケープを防ぐ方法がわかりません。 希望のhtmlタグを含むように出力するにはどうすればよいですか? 入力パラメータ値「AB」Bのよう文字列にHTMLブラウザに示す<B> B </B >を導くべきである:xsl:functionがhtmlタグを含む文字列値を返す方法

私が達成しようとしているかの簡単な例は次のようですコース。

私が試した関数の例は以下のとおりです。結果として得られる文字列はA & lt; b & gt; B & lt;/b & gt; (このエンティティがこのエディタで解釈されるのを防ぐために空白を追加しなければならないことに注意してください)、A <b> B </b >のように表示されます。

xsl:elementをxsl:functionコードで使用することはできません。これは効果がないためです。私は、関数呼び出しの文字列結果に<と>文字を含むようにし、文字列resultを出力結果ファイルに追加します。ここで

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:custom="http://localhost:8080/customFunctions"> 

    <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/> 

    <xsl:function name="custom:test"> 
     <xsl:param name="str"/> 

     <xsl:value-of select="substring($str,1,1)"/> 
     <xsl:text disable-output-escaping="yes"><![CDATA[<b>]]></xsl:text> 
     <xsl:value-of select="substring($str,2)"/> 
     <xsl:text disable-output-escaping="yes"><![CDATA[</b>]]></xsl:text> 
    </xsl:function> 

    <xsl:template match="/"> 
     <xsl:element name="html"> 
      <xsl:element name="body"> 
       <xsl:value-of select="custom:test('AB')"/> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

答えて

6

ではなく、価値のをシーケンスを使用して、関数が(通常は単にリテラル結果要素を書き込むことによって行われている)ノードを返すことを確認し、一例である:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:custom="http://localhost:8080/customFunctions" 
    exclude-result-prefixes="custom"> 

    <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/> 

    <xsl:function name="custom:test"> 
     <xsl:param name="str"/> 

     <xsl:value-of select="substring($str,1,1)"/> 
     <b> 
      <xsl:value-of select="substring($str,2)"/> 
     </b> 
    </xsl:function> 

    <xsl:template match="/"> 
     <xsl:element name="html"> 
      <xsl:element name="body"> 
       <xsl:sequence select="custom:test('AB')"/> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+1

簡単なこと?知られていた/試したことがあります!私はまた、これ自身の別の簡単な解決策を述べました:私は、関数呼び出しにエスケープ出力を追加するのを忘れていました: これは問題を解決します。 – Maestro13

+2

無効な出力エスケープ・ハックを避けるために、関数本体にノードを作成するだけで、文字列を作成する必要はなく、文字列ではなく( 'xsl:sequence'を使って)返された関数結果を出力する必要がありますvalue( 'xsl:value-of ')を指定します。 –

+0

これを今やっている - それはずっとエレガントです。 – Maestro13

関連する問題