【发布时间】:2023-03-18 12:25:01
【问题描述】:
我遇到了 Edge 和 IE11 使用 XSLT 将 HTML 转换为 XML 的问题。
转换时,仅包含空格(一个或多个)的元素在 Edge 和 IE11 中转换后变成空元素或自闭合元素; Chrome 和 Firefox 保留空格。从 XML 到 HTML 和从 HTML 到 XML 确实如此
我创建了一个从 HTML 到 XML 的问题的 Codepen 示例,它是代码的超精简版本,以最小的噪音演示我正在使用的过程是什么。
https://codepen.io/akealey/pen/YzyEmpz
在 Chrome 和 Edge 中运行笔,结果将显示 Edge 删除空间。
有什么办法可以保留空间吗?我已经经历了各种不同的属性和设置来做到这一点,但没有任何效果。
正在转换的标记存在于网页上(我可以完全控制的网页,我不能控制的文档)。
var outStr, processor, implementationObject, transformedDocument;
// a trimmed down document all the way to the element in question
var xmlStr = '<div> </div>';
// an alternate bare bones xslt. also does not generate a space in the output
var xsltStr = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\n<xsl:output method="xml" encoding="utf-8" indent="no"/>\n<xsl:template match="/">\n<xsl:copy-of select="*" />\n</xsl:template></xsl:stylesheet>';
// create the dom parser
var domParser = new DOMParser();
// parse both xml and xslt into actual dom objects. Note xml has the xml header prepended
var xmlDoc = domParser.parseFromString('<?xml version="1.0" ?>' + xmlStr, 'text/xml');
var xsltDoc = domParser.parseFromString(xsltStr, 'text/xml');
// test what xslt processors are available. if chrome, firefox, edge - else ie11
if (typeof XSLTProcessor !== "undefined" && XSLTProcessor !== null) {
// Chrome
// Edge
// Firefox
processor = new XSLTProcessor();
processor.importStylesheet(xsltDoc);
//edge has the space inside xmlDoc up to this point
transformedDocument = processor.transformToFragment(xmlDoc, document);
// inspecting the tansformed document in Edge shows the element has no space but chrome and firefox does
} else if ('transformNode' in xmlDoc) {
// IE11
transformedDocument = xmlDoc.transformNode(xsltDoc);
} else {
console.log('no transform engine found');
}
// turn the converted xml document into a string
var xmlSerializer = new XMLSerializer();
var transformResult = xmlSerializer.serializeToString(transformedDocument);
console.log(transformResult);
// In Edge .serializeToString() turns the element in to a self closing tag (as there is no content)
var hasSpace = /> <\//.test(transformResult);
console.log(hasSpace);
【问题讨论】:
-
如果使用
xsl:output method="html",IE 或 Edge 是否更有效?毕竟,将使用 transformToFragment 生成的 XSLT 结果插入到 HTML DOM 中,只有使用该输出方法才有意义。 -
@mplungjan 不幸的是没有。输出保持完全相同。
-
对于纯基于 IE 的脚本,我想我记得 MSXML 在其 DOMDocument 上有一个
preserveWhitespace属性,默认情况下为 false,因此对于 IE,您应该能够通过确保设置该属性来解决问题在使用load或loadXML之前设置为 true。我不确定如何指导 Edge 假设或设置它。您是否能够使用例如修复 XML 输入?<div xml:space="preserve"> </div>解析前?
标签: javascript html xslt internet-explorer-11 microsoft-edge