我有实体形式的HTML代码,例如
<zh_tw shortText="">&nbsp;</zh_tw>
嵌入在XML文件中。当我在浏览器中查看XML文本时,我希望将该文本呈现为HTML。我为XML文件创建了一个简单的XSLT,将其转换为表格格式,但我不希望HTML代码显示为代码。
以下是XML代码示例:
<?xml-stylesheet type='text/xsl' href='Simple.xslt'?>
<Projects>
<Project>
<Text Type="surveyitem" SubType="intro" TranslationGroupID="46675">
<zh_tw shortText="">&nbsp;</zh_tw>
</Text>
<Scale Type="scaletext" ScaleTextID="23501">
<en_us>to translate</en_us>
<zh_tw>to translate</zh_tw>
</Scale>
</Text>
</Project>
</Projects>
这是我正在使用的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="4.0"/>
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Translation</th>
</tr>
<xsl:for-each select="Projects/Project/Text">
<tr>
<td><xsl:value-of select="zh_tw"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select="Projects/Project/Text/Scale">
<tr>
<td><xsl:value-of select="zh_tw"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
使用disable-output-escaping是一个坏主意。更好的是使用字符串替换模板作为Welbog的解决方案here。
这个XSLT 1.0样式表...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" version="4.0"/>
<xsl:template name="string-replace-all">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$by"/>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by" select="$by"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="replace-entities">
<xsl:param name="text"/>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="$text" />
<xsl:with-param name="replace" select="'&nbsp;'" />
<xsl:with-param name="by" select="' '" />
</xsl:call-template>
<!-- Add more calls to string-replace-all for each entity reference you want to map. -->
</xsl:template>
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Translation</th>
</tr>
<xsl:for-each select="Projects/Project/Text">
<tr>
<td>
<xsl:call-template name="replace-entities">
<xsl:with-param name="text" select="zh_tw" />
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
<xsl:for-each select="Projects/Project/Text/Scale">
<tr>
<td>
<xsl:call-template name="replace-entities">
<xsl:with-param name="text" select="zh_tw" />
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
...当应用于您的输入时,将产生此html ...
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Translation</th>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td>to translate</td>
</tr>
</table>
</body>
</html>
...将中间行简单地渲染为空格。在上面的列表中,中间行的td标记之间的空白实际上是具有代码点160的字符,而不是正常空格字符。当然,这在代码清单中没有表现得很好。
某些XSLT处理器可能会将nbsb字符序列化为 
或甚至
。所有这些结果都应该没问题,因为它们对浏览器意味着同样的事情,并且都会以相同的方式呈现。