javascript - 在 chrome/webkit 中使用 XSLT 转换 HTML 节点

标签 javascript xslt webkit

我想使用 XSL 样式表从 XHTML 页面转换 HTML 节点。

这是我使用的函数:

function XSLT(xml,xsl) {
        var tmpElt = document.createElement("div");

        if (window.ActiveXObject){
            //Version IE
            tmpElt.innerHTML = xml.transformNode(xsl);
        }else{
            //Version ECMA
            var xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            var result = xsltProcessor.transformToFragment(xml, document);

            var serializer = new XMLSerializer();
            var str = serializer.serializeToString( result );

            tmpElt.innerHTML = str;
        }

        return tmpElt;
}

只要 xml 不是 HTMLElement,这将适用于 chrome。准确地说,这一行:

var result = xsltProcessor.transformToFragment(xml, document);

在 Chromium 上返回 null [大部分时间]。在 Firefox 上它表现正常。


我试过这个解决方法:

  • 使用 outerHTML 序列化 xml(甚至使用 XMLSerializer::serializeToString() )
  • 用新的 DOMParser() 解析它
  • XSLT 结果

但不幸的是,outerHTML 和 innerHTML 不会生成正确的 XHTML,也不会呈现有效的 XML(它不会关闭像 <hr /> 这样的单个标签)。XMLSerializer 也不会关闭单个标签,这很令人惊讶对我来说。


我注意到当实际的 HTML 不包含任何自关闭标签时,HTML 节点转换将异常有效。所以我希望 Chrome 在 XSLT 之前使用 XMLSerializer 或 outerHTML 在内部序列化 HTML。

这是 JSFiddle:http://jsfiddle.net/eVbv7/

那么,我怎样才能在 Chrome 上使用 XSLT HTML 节点呢?我需要一种方法来正确序列化 XHTML 节点,或者任何解决方法都可以。

最佳答案

我再次思考这个问题,然后推测如果您只是创建一个虚拟 XML DOM 文档然后从 HTML DOM 文档导入节点元素,您是否可能不需要为 Chrome 或 Webkit 自定义克隆或序列化。所以我写了http://jsfiddle.net/5TNH9/事实上,Chrome 13 和 Safari 5.1 至少都执行了转换。因此,这可能是避免使用您自己的脚本代码完全实现序列化或克隆的另一种选择。

但是请注意,在 jsfiddle 上的那个测试用例中,Chrome 和 Safari 都出现了重复 br 元素的问题,而 Mozilla 或 Opera 不会出现这种情况。我目前无法判断这个问题是我选择的方法的普遍问题还是那个小测试用例特有的问题。

关于javascript - 在 chrome/webkit 中使用 XSLT 转换 HTML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985048/

相关文章:

css - 不能一起动画模糊和变换

javascript - node Attributes[] array 在 IE 中提供额外的属性

asp.net - ajax 是否破坏了我的 javascript 对象?

xml - 使用 XSLT 查找给定一组参数的节点

xslt - 具有命名空间的元素上的 xpath 选择

html - 段落 :hover not working properly in Chrome

objective-c - 使用 webView 加载不同的页面 : decidePolicyForNavigationAction: request: frame: decisionListener: method

javascript - 如何在 JavaScript 中执行 GPS 坐标三 Angular 测量?

javascript - 使用 windowScriptObject 和 WebKit 通过 JavaScript 调用 MacRuby

xml - 删除元素中的空命名空间声明