【发布时间】:2015-10-08 05:32:45
【问题描述】:
我在浏览器中使用 xml+xsl 并在 javascript 中处理异步页面,但无法将 xml 处理的 tr 元素添加到表 tbody 中,因为行元素看起来像纯文本.我发现一些技巧可以通过复制 innerHTML(convertChild 函数)来修复它:
var xmlDom = pageProcessor().transformToDocument(xml);
var root = xmlDom.documentElement;
var tbody = document.getElementById('table-content');
for (var i = 0; i < root.childElementCount; i++) {
tbody.appendChild(convertChild(root.children[i]));
}
function convertChild(source) {
var tmp1 = document.createElement('tbody');
tmp1.appendChild(source);
var tmp2 = document.createElement('tbody');
tmp2.innerHTML = tmp1.innerHTML;
return tmp2.firstChild;
}
pageProcessor 函数返回带有导入的 xsl 样式表的 XSLTProcessor。 xml 变量是 Sarissa 库 dom 文档。 在调试器中 root.children[i] 看起来是有效的。
如何摆脱这种 hack 并正确地将元素附加到表中?
更新:
我使用的是 Firefox 37.0.2
xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<rows>
<row><item>key44</item><item>val44</item></row>
<row><item>key45</item><item>val45</item></row>
...
</rows>
我 console.log 将 xslt 处理的每个 html 元素从 row item 记录到 tr td
已解决:
谢谢你,马丁·霍南!
transformToFragment(sourceDoc, ownerDoc)
有效!
请发表答案。
【问题讨论】:
-
您使用哪种浏览器? XML 看起来如何,您是否确保使用 XSLT 创建 HTML 结果元素,方法是确保您有一个带有
<html><body>...</body></html>和<xsl:output method="html"/>的完整 HTML 文档,或者确保它是一个带有xmlns="http://www.w3.org/1999/xhtml"的 XHTML 片段? Sarissa 不提供像 Mozilla 的transformToFragment这样的功能吗? -
根据dev.abiss.gr/sarissa/jsdoc/symbols/… 有一个方法
transformToFragment(sourceDoc, ownerDoc)所以我建议尝试var resultDoc = pageProcessor.transformToFragment(xml, document);然后希望你能够将appendChild节点从resultDocument变成tbody后代您的 HTMLdocument. -
在 Firefox 中,
tr元素只是一个 HTMLtr元素,如果它是在 HTML 文档或文档片段中创建的,或者如果它是在 XHTML 命名空间http://www.w3.org/1999/xhtml中创建的。否则,它是一个未知的 XML 元素,恰好有一个本地名称tr。
标签: javascript html xslt sarissa