当前位置:  开发笔记 > 前端 > 正文

XSL字符转义问题

如何解决《XSL字符转义问题》经验,为你挑选了2个好方法。

我写这篇文章是因为我真的碰到了墙,无法继续前进.在我的数据库中,我已经像这样转义了HTML : "<p>My name is Freddy and I was".

我想将其显示为HTML或剥离我的XSL模板中的HTML标记.这两种解决方案都适合我,我会选择更快的解决方案.

我在线阅读了几篇帖子但找不到解决方案.我也尝试过disable-output-escape但没有成功.基本上似乎问题是在XSL执行中的某个地方,引擎正在将其改变<p>为:&lt;p&gt;.

它正在转化&&.如果它有帮助,这是我的XSL代码.我在顶部尝试了几种带有和不带输出标签的组合.

任何帮助将不胜感激.提前致谢.




  

  
    
mySlides
myController
tobereplace
myController
myController jFlowControl aa

Tomalak.. 18

基于您拥有 HTML字符串的假设,

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

会产生:

<p>My name is Freddy &amp; I was

您获得的数据与数据库完全相同,但当然您会在输出中看到HTML标记.所以你需要的是一个执行以下字符串替换的机制:

"&lt;""<"(有效地<改为未<转义的输出)

"&gt;"">"(有效地>改为未>转义的输出)

"&quot;""""(有效地"改为未"转义的输出)

"&amp;""&"(有效地&改为未&转义的输出)

从您的XSL我推断出以下测试输入XML:


  
    Article 1
    1
    Article_1
    &lt;p&gt;Article 1 summary &amp;amp; description.&lt;/p&gt;
  
  
    Article 2
    2
    Article_2
    &lt;p&gt;Article 2 summary &amp;amp; description.&lt;/p&gt;
  

我更改了您提供的样式表并实现了这样的替换机制.如果您应用以下XSLT 1.0模板:



  

  
    
    
    
    
  

  
    

aa

然后生成此输出HTML:

Article 1

Article 1 summary & description.

Article 2

Article 2 summary & description.

aa Article 1 aa Article 2

注意

使用临时命名空间和嵌入式元素()来创建要替换的字符列表

使用递归来模拟输入中所有受影响字符的迭代替换

unescape模板中使用隐式上下文来传输当前要替换的字符的信息

另外注意:

使用模板模式为同一输入获取不同的输出(这将替换您的templatenumber参数)

大部分时间都不需要元素.它们可以安全地用内联表示法替换(attributename="{attributevalue}")

使用该concat()函数创建URL

一般来说,将转义的HTML存储在数据库中是一个坏主意(更一般地说:将HTML存储在数据库中是一个坏主意.).你为自己设置了各种各样的问题,这就是其中之一.如果您无法更改此设置,我希望该解决方案可以帮助您.

我不能保证它在所有情况下都做对了,它可能会打开安全漏洞(想想XSS),但处理这个问题并不是问题的一部分.无论如何,请考虑自己警告.

我现在需要休息一下.;-)



1> Tomalak..:

基于您拥有 HTML字符串的假设,

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

会产生:

<p>My name is Freddy &amp; I was

您获得的数据与数据库完全相同,但当然您会在输出中看到HTML标记.所以你需要的是一个执行以下字符串替换的机制:

"&lt;""<"(有效地<改为未<转义的输出)

"&gt;"">"(有效地>改为未>转义的输出)

"&quot;""""(有效地"改为未"转义的输出)

"&amp;""&"(有效地&改为未&转义的输出)

从您的XSL我推断出以下测试输入XML:


  
    Article 1
    1
    Article_1
    &lt;p&gt;Article 1 summary &amp;amp; description.&lt;/p&gt;
  
  
    Article 2
    2
    Article_2
    &lt;p&gt;Article 2 summary &amp;amp; description.&lt;/p&gt;
  

我更改了您提供的样式表并实现了这样的替换机制.如果您应用以下XSLT 1.0模板:



  

  
    
    
    
    
  

  
    

aa

然后生成此输出HTML:

Article 1

Article 1 summary & description.

Article 2

Article 2 summary & description.

aa Article 1 aa Article 2

注意

使用临时命名空间和嵌入式元素()来创建要替换的字符列表

使用递归来模拟输入中所有受影响字符的迭代替换

unescape模板中使用隐式上下文来传输当前要替换的字符的信息

另外注意:

使用模板模式为同一输入获取不同的输出(这将替换您的templatenumber参数)

大部分时间都不需要元素.它们可以安全地用内联表示法替换(attributename="{attributevalue}")

使用该concat()函数创建URL

一般来说,将转义的HTML存储在数据库中是一个坏主意(更一般地说:将HTML存储在数据库中是一个坏主意.).你为自己设置了各种各样的问题,这就是其中之一.如果您无法更改此设置,我希望该解决方案可以帮助您.

我不能保证它在所有情况下都做对了,它可能会打开安全漏洞(想想XSS),但处理这个问题并不是问题的一部分.无论如何,请考虑自己警告.

我现在需要休息一下.;-)



2> David..:

您不应将转义的HTML存储在数据库中.如果您的数据库包含实际的"<"字符,那么"disable-output-escaping"命令将执行您想要的操作.

如果您无法更改数据,则必须在执行转换之前取消数据.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有