以文本方式查看主题 - 中文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"?> 常用的方法是用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"?> 输出结果:<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 |