0

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

<zh_tw shortText="">&amp;nbsp;</zh_tw>    

嵌入在 XML 文件中。当我在浏览器中查看 XML 文本时,我希望将该文本呈现为 HTML。我创建了一个简单的 XSLT,用于将 XML 文件转换为表格格式,但我不希望 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>
4

1 回答 1

0

使用禁用输出转义是一个坏主意。更好的是在这里使用字符串替换模板作为 Welbog 的解决方案。

这个 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;. 所有这些结果都应该没问题,因为它们对浏览器意味着同样的事情,并且都会以相同的方式呈现。

于 2012-10-02T05:15:53.530 回答