2012-01-29 25 views
2

我試圖將java函數轉置爲xsl:function spec。 該函數基本上在子字符串周圍放置了html標籤。 我現在碰到困難:使用java內聯代碼,這完美的工作,但我無法弄清楚如何使用xsl:函數時防止輸出轉義。 我如何實現輸出以包含所需的html標籤?xsl:函數如何返回包含html標記的字符串值

的我試圖實現一個簡單的例子如下: 輸入參數值「AB」應導致串A <b>乙</B >,在HTML瀏覽器中顯示作爲的課程。

我試過的例子函數是下面的;但後來得到的字符串是A & lt; b & gt; B & lt;/b & gt; (請注意,我必須添加空白以防止實體在此編輯器中被解釋),這當然會在瀏覽器中顯示爲A <b> B </b >。

請注意,xsl:元素不能在xsl:function代碼中使用,因爲它沒有效果;我希望函數調用的字符串結果包含<和>字符,然後將字符串結果添加到輸出結果文件。

<?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 2012-01-29 12:35:02

+2

考慮爲了避免任何禁用輸出轉義的黑客,您只需要在函數體中創建節點而不是字符串,並且您需要確保輸出返回的函數結果(使用'xsl:sequence'),而不是其字符串值(使用'xsl:value-of'')。 – 2012-01-29 12:42:49

+0

這樣做當然 - 它也更優雅。 – Maestro13 2012-01-29 12:54:58

相關問題