0

次のようなエンティティ形式の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>
4

1 に答える 1

0

disable-output-escaping を使用するのは悪い考えです。ここで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 に答える