我想将其显示为HTML或剥离我的XSL模板中的HTML标记.这两种解决方案都适合我,我会选择更快的解决方案.
我在线阅读了几篇帖子但找不到解决方案.我也尝试过disable-output-escape但没有成功.基本上似乎问题是在XSL执行中的某个地方,引擎正在改变这个& lt; p& gt;进入:& amp; lt; p& amp; gt;.
正在转换&进入& amp;如果它有帮助,这是我的XSL代码.我在顶部尝试了几种带有和不带输出标签的组合.
任何帮助将不胜感激.提前致谢.
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" omit-xml-declaration="yes"/> <xsl:template match="DocumentElement"> <div> <xsl:attribute name="id">mySlides</xsl:attribute> <xsl:apply-templates> <xsl:with-param name="templatenumber" select="0"/> </xsl:apply-templates> </div> <div> <xsl:attribute name="id">myController</xsl:attribute> <xsl:apply-templates> <xsl:with-param name="templatenumber" select="1"/> </xsl:apply-templates> </div> </xsl:template> <xsl:template match="DocumentElement/QueryResults"> <xsl:param name="templatenumber">tobereplace</xsl:param> <xsl:if test="$templatenumber=0"> <div> <xsl:attribute name="id">myController</xsl:attribute> <div> <xsl:attribute name="class">article</xsl:attribute> <h2> <a> <xsl:attribute name="class">title</xsl:attribute> <xsl:attribute name="title"><xsl:value-of select="Title"/></xsl:attribute> <xsl:attribute name="href">/stories/stories-details/articletype/articleview/articleid/<xsl:value-of select="ArticleId"/>/<xsl:value-of select="SEOTitle"/>.aspx</xsl:attribute> <xsl:value-of select="Title"/> </a> </h2> <div> <xsl:attribute name="style">text-indent: 25px;</xsl:attribute> <xsl:attribute name="class">articlesummary</xsl:attribute> <xsl:call-template name="removeHtmlTags"> <xsl:with-param name="html" select="Summary" /> </xsl:call-template> </div> </div> </div> </xsl:if> <xsl:if test="$templatenumber=1"> <div> <xsl:attribute name="id">myController</xsl:attribute> <span> <xsl:attribute name="class">jFlowControl</xsl:attribute> aa </span> </div> </xsl:if> </xsl:template> <xsl:template name="removeHtmlTags"> <xsl:param name="html"/> <xsl:choose> <xsl:when test="contains($html,'<')"> <xsl:value-of select="substring-before($html,'<')"/> <!-- Recurse through HTML --> <xsl:call-template name="removeHtmlTags"> <xsl:with-param name="html" select="substring-after($html,'>')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$html"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
解决方法
<p>My name is Freddy & I was
然后,如果你将它转义并将其存储在数据库中,它将成为:
<p>My name is Freddy &amp; I was
因此,如果您将其作为XML检索(不事先取消它),结果将是:
&lt;p&gt;My name is Freddy &amp;amp; I was
和< xsl:value-of select =“.” disable-output-escaping =“是”/>会产生:
<p>My name is Freddy &amp; I was
您获得的数据与数据库完全相同,但当然您会在输出中看到HTML标记.所以你需要的是一个执行以下字符串替换的机制:
>“& amp; lt;”用“& lt;” (有效地改变< lt; to< in unescaped ouput)
>“& amp; gt;”用“& gt;” (在未转义的输出中有效地改变& gt;到>)
>“& amp; quot;”用“& quot;” (在未转义的输出中有效地改变&“到”)
>“& amp; amp;”用“& amp;” (有效改变& amp; to& in unescaped ouput)
从您的XSL我推断出以下测试输入XML:
<DocumentElement> <QueryResults> <Title>Article 1</Title> <ArticleId>1</ArticleId> <SEOTitle>Article_1</SEOTitle> <Summary>&lt;p&gt;Article 1 summary &amp;amp; description.&lt;/p&gt;</Summary> </QueryResults> <QueryResults> <Title>Article 2</Title> <ArticleId>2</ArticleId> <SEOTitle>Article_2</SEOTitle> <Summary>&lt;p&gt;Article 2 summary &amp;amp; description.&lt;/p&gt;</Summary> </QueryResults> </DocumentElement>
我已经更改了您提供的样式表并实现了这样的替换机制.如果您应用以下XSLT 1.0模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:namespace" exclude-result-prefixes="my" > <xsl:output method="html" omit-xml-declaration="yes"/> <my:unescape> <my:char literal="<" escaped="&lt;" /> <my:char literal=">" escaped="&gt;" /> <my:char literal=""" escaped="&quot;" /> <my:char literal="&" escaped="&amp;" /> </my:unescape> <xsl:template match="DocumentElement"> <div id="mySlides"> <xsl:apply-templates mode="slides" /> </div> <div id="myController"> <xsl:apply-templates mode="controller" /> </div> </xsl:template> <xsl:template match="DocumentElement/QueryResults" mode="slides"> <div class="article"> <h2> <a class="title" title="{Title}" href="{concat('/stories/stories-details/articletype/articleview/articleid/',ArticleId,'/',SEOTitle,'.aspx')}"> <xsl:value-of select="Title"/> </a> </h2> <div class="articlesummary" style="text-indent: 25px;"> <xsl:apply-templates select="document('')/*/my:unescape/my:char[1]"> <xsl:with-param name="html" select="Summary" /> </xsl:apply-templates> </div> </div> </xsl:template> <xsl:template match="DocumentElement/QueryResults" mode="controller"> <span class="jFlowControl"> <xsl:text>aa </xsl:text> <xsl:value-of select="Title" /> </span> </xsl:template> <xsl:template match="my:char"> <xsl:param name="html" /> <xsl:variable name="intermediate"> <xsl:choose> <xsl:when test="following-sibling::my:char"> <xsl:apply-templates select="following-sibling::my:char[1]"> <xsl:with-param name="html" select="$html" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:value-of select="$html" disable-output-escaping="yes" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:call-template name="unescape"> <xsl:with-param name="html" select="$intermediate" /> </xsl:call-template> </xsl:template> <xsl:template name="unescape"> <xsl:param name="html" /> <xsl:choose> <xsl:when test="contains($html,@escaped)"> <xsl:value-of select="substring-before($html,@escaped)" disable-output-escaping="yes"/> <xsl:value-of select="@literal" disable-output-escaping="yes" /> <xsl:call-template name="unescape"> <xsl:with-param name="html" select="substring-after($html,@escaped)"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$html" disable-output-escaping="yes"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
<div id="mySlides"> <div class="article"> <h2> <a class="title" title="Article 1" href="/stories/stories-details/articletype/articleview/articleid/1/Article_1.aspx">Article 1</a> </h2> <div class="articlesummary" style="text-indent: 25px;"> <p>Article 1 summary & description.</p> </div> </div> <div class="article"> <h2> <a class="title" title="Article 2" href="/stories/stories-details/articletype/articleview/articleid/2/Article_2.aspx">Article 2</a> </h2> <div class="articlesummary" style="text-indent: 25px;"> <p>Article 2 summary & description.</p> </div> </div> </div> <div id="myController"> <span class="jFlowControl">aa Article 1</span> <span class="jFlowControl">aa Article 2</span> </div>
注意
>使用临时命名空间和嵌入式元素(< my:unescape>)来创建要替换的字符列表
>使用递归来模拟输入中所有受影响字符的迭代替换
>在unescape模板中使用隐式上下文来传输当前要替换的字符的信息
另外注意:
>使用模板模式为同一输入获取不同的输出(这取代了你的templatenumber参数)
>大多数情况下,不需要< xsl:attribute>元素.它们可以安全地用内联表示法替换(attributename =“{attributevalue}”)
>使用concat()函数创建URL
一般来说,将转义的HTML存储在数据库中是一个坏主意(更一般地说:将HTML存储在数据库中是一个坏主意.).你设置自己来解决各种各样的问题,这就是其中之一.如果您无法更改此设置,我希望该解决方案可以帮助您.
我不能保证它在所有情况下都做对了,它可能会打开安全漏洞(想想XSS),但处理这个问题并不是问题的一部分.无论如何,请考虑自己警告.
我现在需要休息一下.