You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox中XSLT样式表无法生成预期XML缩进,Chrome正常

问题:Chrome与Firefox中XSLT处理XML的缩进输出不一致

使用以下代码处理XML时,Chrome能生成带缩进的格式化XML,但Firefox输出为无缩进的单行文本:

var sourceXml = '<Environment name=“DEFAULT”>\n<ADFConnections>\n<Connection name="MapViewer”>\n<Attribute name="url”>\n</Connection>\n</ADFConnections>\n</Environment>'
var xmlDoc = new DOMParser().parseFromString(sourceXml, 'application/xml');
var xsltDoc = new DOMParser().parseFromString([
      '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
      '  <xsl:output indent="yes"/>',
      '  <xsl:strip-space elements="*"/>',
      '  <xsl:template match="node()|@*">',
      '    <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
      '  </xsl:template>',
      '</xsl:stylesheet>',
  ].join('\n'), 'application/xml'); 

var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsltDoc);      
var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
var resultXml = new XMLSerializer().serializeToString(resultDoc);

Firefox中的输出示例:

<Environment name="DEFAULT"><ADFConnections><Connection name="MapViewer”>.....</Connection></ADFConnections></Environment>
原因分析

核心问题在于浏览器对XSLT输出的缩进处理和XMLSerializer的行为差异:

  • Chrome的XSLT处理器执行<xsl:output indent="yes"/>时,会直接把缩进用的空白文本节点插入生成的DOM文档中;而Firefox的XSLT处理器虽然识别indent="yes",但不会在DOM中添加这些空白节点——它仅在将结果直接输出到浏览器页面(比如用transformToFragment插入DOM)时才会应用缩进格式。
  • XMLSerializer.serializeToString()只会序列化DOM中实际存在的节点。因为Firefox的XSLT处理结果DOM里没有缩进空白节点,所以序列化后就是紧凑的单行文本;Chrome的DOM包含这些空白节点,序列化后自然带有缩进。

如果需要在Firefox中获取带缩进的XML字符串,要么手动实现缩进逻辑,要么先通过transformToFragment将结果插入页面,再从页面元素中提取格式化后的文本。

内容的提问来源于stack exchange,提问作者Govardhan Reddy Peddireddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:12:51