2010-10-29 92 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