JavaScript调用XSLTProcessor.transformToDocument报错Document is empty如何解决
错误原因
- XSLT中声明了
<xsl:output method="xml"/>,要求输出格式为XML,但实际转换输出的是纯JSON文本,不存在合法的XML根节点,不符合XML格式规范。 - 浏览器
XSLTProcessor的transformToDocument()方法会强制将转换结果解析为标准XMLDocument对象,当输出内容不满足XML格式要求时就会解析失败,返回包含parsererror的XHTML错误文档。 - 在线测试平台未做强制XML解析,直接输出转换后的原始文本,因此可以正常得到结果。
解决方案
有两种可行方案,可根据业务场景选择:
方案1:改为纯文本输出,直接读取转换结果
- 将XSLT中的输出配置修改为文本模式:把
<xsl:output method="xml"/>替换为<xsl:output method="text" encoding="UTF-8"/>。 - 转换时使用
transformToFragment接口读取文本内容,无需解析为XMLDocument:
xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); const resultFragment = xsltProcessor.transformToFragment(xml, document); const resultJson = resultFragment.textContent; console.log(resultJson);
方案2:包装输出为合法XML结构
如果需要保留method="xml"的配置,可将JSON内容包裹在自定义XML根节点内:
修改XSLT的根匹配模板如下:
<xsl:template match="/"> <root> { "solution": [ { "name" : "<xsl:value-of select="SOLUTION/CONFIGURATION/@NAME"/>", "product" : "<xsl:value-of select="SOLUTION/CONFIGURATION/INST/@OBJ_KEY"/>", "kbname" : "<xsl:value-of select="SOLUTION/CONFIGURATION/@KBNAME"/>", "objects": { } } ] } </root> </xsl:template>
转换完成后,从返回的XMLDocument中读取root节点的文本内容,即可得到所需的JSON字符串。
内容的提问来源于stack exchange,提问作者user1182625
相关产品推荐
相关产品推荐

