以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  [原创]用XSL的xsl:copy-of将XML中CDATA节点内容直接输出为HTML  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=50492)


--  作者:Qr
--  发布时间:7/25/2007 10:16:00 AM

--  [原创]用XSL的xsl:copy-of将XML中CDATA节点内容直接输出为HTML
前些日子发“如果浏览器不支持disable-output-escaping="yes"属性?”的时候,只讲到用<xsl:copy-of>,但没有细说如何实现。论坛上依然发了不少相关的贴子,询问该如何实现。今天就贴点代码上来,希望对大家有帮助。

html.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href ="html.xsl"?>
<root>
<htmlstr>
<![CDATA[<html><body><div>test</div></body></html>]]>
</htmlstr>
</root>

常用的方法是用disable-output-escaping="yes"来输出: <xsl:value-of select="htmlstr" disable-output-escaping="yes"/>

但相当一部分浏览器不支持disable-output-escaping属性,也是W3C所不推荐的。xsl:copy-of才是最佳的解决方案。

html.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="root">
      <xsl:copy-of select="htmlstr/node()"/>
</xsl:template>
</xsl:stylesheet>

输出结果:<html><body><div>test</div></body></html>


--  作者:hexun831012
--  发布时间:7/25/2007 11:26:00 AM

--  
非也非也,应该输出
<copy xmlns=""><html><body><div>test</div></body></html></copy>
才对,我还是推荐用disable-output-escaping="yes",并采用
<xsl:if test="system-property('xsl:vendor') = 'Transformiix'">
  <script type="text/javascript">
    var paragraphs = document.getElementsByTagName("p");
    for(var i = 0; i < paragraphs.length; i ++)
    {
      paragraphs[i].innerHTML = paragraphs[i].textContent;
    }
  </script>
</xsl:if>
这样的方式,因为在如firefox中,他无法忽略对<copy>标签的解释,如果<copy>中套个<a>,那么<copy>将影响对<a>的解释,导致显示不出来,所以<xsl:copy>不可行。

和QR唱反调真是不好意思,呵呵。


--  作者:Qr
--  发布时间:7/26/2007 12:30:00 PM

--  
偶是在IE浏览器和JS+DOM两种方式下查看转换结果,才得出以上结论,不一定全面,但没有看到copy的存在。

GOOGLE了一下,网上也有基本相同的代码,但不保证偶的结论是正确的,只是使用了W3C的推荐的做法。

“百花齐放、百家争鸣,应该成为我国发展科学、繁荣文学艺术的方针。”


--  作者:hexun831012
--  发布时间:7/26/2007 2:09:00 PM

--  
也许把copy套在最外面没有什么影响,但我是的时候会输出<copy xmlns="">,命名空间与文档相同


--  作者:Qr
--  发布时间:7/26/2007 6:07:00 PM

--  
你是不是用工具看转换结果啊,输出主要是浏览器,如果在浏览器中结果正确,那目的不是达到了吗?如果是XML2XML那就另当别论了。

你的js用法固然好,但是偶的主要目的还是在XSL的应用,必竟disable-output-escaping不是W3C的标准。


--  作者:hexun831012
--  发布时间:7/27/2007 1:16:00 PM

--  
不好意思,我测试发现在firefox 2.0.0.5中没有我说的那个现象了,可能在2.0.0.2之前的版本有这个问题,我再测测


--  作者:hexun831012
--  发布时间:7/27/2007 1:53:00 PM

--  
我找到原因了,跟命名空间有关
xml:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="page.xsl" type="text/xsl"?>
<page version="1.0" xmlns="http://www.hexsoft.org/schema/page.xsd">
 <paragraph>12333333333333333333333</paragraph>
 <paragraph><a href="sdk/">SDK</a></paragraph>
</page>
xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:page="http://www.hexsoft.org/schema/page.xsd">
 <xsl:output method="html" indent="no"/>
 <xsl:template match="page:page">
  <div class="page">
   <xsl:apply-templates select="page:paragraph"/>
  </div>
 </xsl:template>
 <xsl:template match="page:paragraph">
  <p>
   <xsl:copy-of select="node()"/>
  </p>
 </xsl:template>
</xsl:stylesheet>
--  作者:Qr
--  发布时间:7/27/2007 2:06:00 PM

--  
呵呵,辛苦啦,坐享其成了。
--  作者:hexun831012
--  发布时间:7/27/2007 2:07:00 PM

--  
是不是在firefox下有问题啊,而且生成的代码毫无问题,但表示不对
Qr老大可有办法


--  作者:Qr
--  发布时间:7/27/2007 3:55:00 PM

--  
XSL中有个属性可以“屏蔽”掉元素中的xmlns,具体一下子记不清了,你也找找看。
--  作者:Qr
--  发布时间:7/27/2007 11:45:00 PM

--  
你这样改试试看:
<page>
  <div class="page">
   <xsl:apply-templates select="page:paragraph"/>
  </div>
</page>
或者把page(用page是因是XML的根节点)改成<html xmlns:page="http://www.hexsoft.org/schema/page.xsd">试试。

在创建节点时加上根节点所在的命名空间的引用,似乎有点关系哦。命名空间这东东偶不是很熟悉,简单应用而已,等你解决了啊,呵呵。


--  作者:hexun831012
--  发布时间:7/30/2007 11:02:00 AM

--  
经过我不懈的努力,我决定放弃
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms