渲染的浏览器逃脱XML

对于下面的XML我想呈现转义文本部分从XSLT,例如浏览器:

<one> &lt;text&gt; </one>

我想在浏览器中呈现的标记是:

&lt;text&gt;

但是,当我使用应用模板,看起来像以下

<xsl:template match="text()" mode="literalHTML"> <xsl:copy-of select="."> </xsl:copy-of> </xsl:template>

上述XML是越来越呈现为:

<text>

我怎么能修改此模板,以便它打印&LT;文本&GT; 在浏览器?

最好的问候,凯沙夫

--------------解决方案-------------

这可以通过使用相当棘手的递归处理来实现在XSLT 1.0。

幸运的是,我们可以使用FXSL(XSLT模板库)来解决相同的任务,在短短几分钟的时间:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="xsl f testmap">
<xsl:import href="str-dvc-map.xsl"/>

<testmap:testmap/>

<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>
<xsl:call-template name="str-map">
<xsl:with-param name="pFun" select="$vTestMap"/>
<xsl:with-param name="pStr" select="/*/text()"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="escape" mode="f:FXSL"
match="*[namespace-uri() = 'testmap']">
<xsl:param name="arg1"/>

<xsl:choose>
<xsl:when test="$arg1 = '&lt;'">&amp;lt;</xsl:when>
<xsl:when test="$arg1 = '&gt;'">&amp;gt;</xsl:when>
<xsl:otherwise><xsl:value-of select="$arg1"/></xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

当这个变换被应用在下面的XML文档

<one>
&lt;text&gt;
</one>

通缉的结果是产生

&amp;lt;text&amp;gt;

它在浏览器中显示 &lt;text&gt;

而“棘手递归处理”

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" name="text">
<xsl:param name="text" select="."/>
<xsl:if test="$text != ''">
<xsl:variable name="first" select="substring($text,1,1)"/>
<xsl:choose>
<xsl:when test="$first = '&lt;'">&amp;lt;</xsl:when>
<xsl:when test="$first = '&gt;'">&amp;gt;</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$first"/>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="text">
<xsl:with-param name="text" select="substring($text,2,(string-length($text)-1) div 2 + 1)"/>
</xsl:call-template>
<xsl:call-template name="text">
<xsl:with-param name="text" select="substring($text,(string-length($text)-1) div 2 + 3)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

结果:

<one>
&amp;lt;text&amp;gt;
</one>

编辑 :一个DVC模式,以避免溢出。

我也写一个解决方案较早使用递归,但我唯一担心的是性能和是否会有一些内存或者是因为这一些计算器。 我想知道是否会有使用任何解决方案的<xsl:value-of的> <复制的>或? 也请让我知道是否有可能在下面的解决方案的任何改进,如果递归可以转换为循环或等。

<xsl:template match="text()" mode="literalHTML">
<xsl:variable name="txt" select="."/>
<xsl:value-of select="smc:escapeChar(smc:escapeChar(smc:escapeChar($txt,'&amp;','&amp;amp;'),'&lt;','&amp;lt;'),'&gt;','&amp;gt;')"/>
</xsl:template>
<xsl:function name="smc:escapeChar">
<xsl:param name="txt"/>
<xsl:param name="char"/>
<xsl:param name="subs"/>
<xsl:result>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="contains($txt, $char)">
<xsl:variable name="after" select="substring-after($txt,$char)"/>
<xsl:value-of select="substring-before($txt,$char)"/>
<xsl:value-of select="$subs"/>
<xsl:value-of select="smc:escapeChar($after,$char,$subs)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$txt"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$result"></xsl:value-of>
</xsl:result>
</xsl:function>

分类:JavaScript的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.541 (s). 10 q(s)