我将HTML代码嵌入到XML文件中,在浏览器中显示为代码

时间:2012-10-02 01:34:12

标签: html xml xslt

我有实体形式的HTML代码,例如

<zh_tw shortText="">&amp;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="">&amp;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>

1 个答案:

答案 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="'&amp;nbsp;'" />
    <xsl:with-param name="by" select="'&#160;'" />
  </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字符序列化为&#160;或甚至&nbsp;。所有这些结果都应该没问题,因为它们对浏览器意味着同样的事情,并且都会以相同的方式呈现。