我正在处理一个XML文件,该文件的原始HTML存储在节点的属性中(< node data =“HTML ...”>)。
我刚刚意识到HTML是双重编码的,所以不是:
<div>
实际上写成:
&lt;div&gt;
这意味着如果我这样做:
<xsl:value-of select="node/@data" disable-output-escaping="yes" />
我仍然会获得(单个)转义值:
<div>
再一次解决这个问题的最简单方法是什么?
答案 0 :(得分:2)
它绝对不漂亮,但基本上你正在寻找有限数量的字符串替换操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />
<xsl:variable name="ampDbl" select="'&amp;'" />
<xsl:variable name="amp" select="'&'" />
<xsl:variable name="ltDbl" select="'&lt;'" />
<xsl:variable name="lt" select="'<'" />
<xsl:variable name="gtDbl" select="'&gt;'" />
<xsl:variable name="gt" select="'>'" />
<xsl:template match="/">
<xsl:apply-templates select="//@data" mode="unescape" />
</xsl:template>
<xsl:template match="@data" mode="unescape">
<xsl:variable name="step1">
<xsl:call-template name="StringReplace">
<xsl:with-param name="s" select="string()" />
<xsl:with-param name="search" select="$ltDbl" />
<xsl:with-param name="replace" select="$lt" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="step2">
<xsl:call-template name="StringReplace">
<xsl:with-param name="s" select="$step1" />
<xsl:with-param name="search" select="$gtDbl" />
<xsl:with-param name="replace" select="$gt" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="step3">
<xsl:call-template name="StringReplace">
<xsl:with-param name="s" select="$step2" />
<xsl:with-param name="search" select="$ampDbl" />
<xsl:with-param name="replace" select="$amp" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$step3" disable-output-escaping="yes" />
</xsl:template>
<!-- generic string replace template -->
<xsl:template name="StringReplace">
<xsl:param name="s" select="''" />
<xsl:param name="search" select="''" />
<xsl:param name="replace" select="''" />
<xsl:choose>
<xsl:when test="contains($s, $search)">
<xsl:value-of select="substring-before($s, $search)" />
<xsl:value-of select="$replace" />
<xsl:variable name="rest" select="substring-after($s, $search)" />
<xsl:if test="$rest">
<xsl:call-template name="StringReplace">
<xsl:with-param name="s" select="$rest" />
<xsl:with-param name="search" select="$search" />
<xsl:with-param name="replace" select="$replace" />
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$s" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
适用于
<root>
<node data="&lt;div&gt;bla &amp;amp; bla&lt;/div&gt;" />
</root>
给出(源代码中)
<div>bla & bla</div>
当然会在屏幕上显示:
bla & bla
您可能希望为step4
'&quot;'
添加'"'
。