2010-10-29 105 views
2

我有一個看起來像這樣的xml文檔。XSL:用html代替字符串translate()

<?xml version="1.0"?> 
<services> 
    <service sn="1" family="2 Week Wait"> 
    <service_name>2 Week Wait Dermatology</service_name> 
    <speciality>2 Week Wait</speciality> 
    <clinic_types>2 Week Wait Skin</clinic_types> 
    <tag>Malignant neoplasm of skin , Pigmented skin lesion </tag> 
</service> 

我已經成功地得到一切我多麼希望,但對於最後一個好辦法,我想有逗號分隔值顯示爲一個無序列表。

我使用這行XSL輸出列表,

<ul> 
    <li> 
      <xsl:value-of select="translate(tag,',','<![CDATA[</li><li>]]>')" disable-output-escaping="yes" /> 
    </li> 
<ul> 

我得到一個錯誤,指出生成的XML的格式不正確。我試圖用其他東西替換替換部分,它的工作。我也嘗試過使用HTML代碼的標籤沒有運氣,所以我真的很困惑我做錯了什麼。

任何幫助表示讚賞,感謝

+0

可能的重複[是否xslt有split()函數?](http://stackoverflow.com/questions/3336424/does-xslt-have-split-function)或http://stackoverflow.com/questions/584082/ xslt-best-way-split-and-render-comma-separated-text-as-html或http://stackoverflow.com/questions/136500/does-xslt-have-a-split-function。除了使用'fn:traslate()'的錯誤approuch:它只能替換一對一的字符。 – 2010-10-29 12:33:53

+0

我設法通過第一個鏈接得到我的解決方案,非常感謝。我是XSL的新手,所以這是一個新手的錯誤 – 2010-10-29 13:22:11

回答

3

XSLT是XML; select表達式嵌入屬性值中,因此它必須應用另一輪XML轉義。因爲CDATA部分不能生活在一個屬性值,即必須手動應用:

<xsl:value-of select="translate(tag,',','&lt;/li>&lt;li>')" disable-output-escaping="yes" /> 

然而,將disable-output-escapingtranslate輸出是有問題的:如果什麼文本中它有<&字符?您將文本內容轉換爲活動標記,具有有效性和潛在的安全問題。

通常情況下,最好從XSLT本身添加標記。您可以使用tokenize功能拆分在XSLT 2.0串:(如果你正在使用XSLT 1.0本也要做爲使用substring_before/after遞歸模板,這是一種痛苦)

<ul> 
    <xsl:for-each select="tokenize(tag,',')"> 
     <li><xsl:value-of select="."/></li> 
    </xsl:for-each> 
</ul> 

+0

'tokenize'不是一個有效的XSLT或XPath函數。 - > tokenize(tag,',')< - – 2010-10-29 10:47:32

+0

oops發送得太快,是啊,看起來像我必須做遞歸模板的事情。 – 2010-10-29 10:48:14

+0

慚愧!看到[這個答案](http://stackoverflow.com/questions/136500/does-xslt-have-a-split-function/141022#141022)的例子是如何完成的。 – bobince 2010-10-29 11:01:16