【问题标题】:JavaScript XSLTProcessor transformToDocument result is 'Document is empty'JavaScript XSLTProcessor transformToDocument 结果为“文档为空”
【发布时间】:2022-01-03 05:54:09
【问题描述】:

我有有效的 XMLDocument 对象,一个是 XML,另一个是 XSL 1.0。

XSL:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:variable name="empty_string"/>
<xsl:variable name="earthing_cable" select="'AAA'"/>
<xsl:key name="elements" match="INST[./CSTICS/CSTIC[@CHARC='ALT_PRODUCT_NUMBER']]|INST[name(..)='PART'][./CSTICS/CSTIC[@CHARC='VBOM']]"
         use="@COMPLETE"/>
<xsl:template match="/">
{
 "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":
   {

  }
  }
  ]
}
</xsl:template>
<xsl:template name="get_container">
<xsl:param name="port"/>
</xsl:template></xsl:stylesheet>

XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOLUTION></SOLUTION>

这是我的代码(xml 和 xsl 是有效的 XMLDocument 对象):

xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToDocument(xml);
console.log(new XMLSerializer().serializeToString(resultDocument));

console.log 是:

<html xmlns="http://www.w3.org/1999/xhtml"><body><parsererror style="display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"><h3>This page contains the following errors:</h3><div style="font-family:monospace;font-size:12px">error on line 2 at column 1: Document is empty
</div><h3>Below is a rendering of the page up to the first error.</h3></parsererror></body></html>

在这里我测试了 XML 和 XSL,它工作正常:

https://xslttest.appspot.com/

<?xml version="1.0" encoding="UTF-8"?>
{
 "solution": [
 {
   "name" :  "",
   "product" :  "",
   "kbname" :  "",
   "objects":
   {

  }
  }
  ]
}

【问题讨论】:

    标签: javascript xml xslt


    【解决方案1】:

    解决方法是转换为片段,这很好。

    resultDocument = xsltProcessor.transformToFragment(xml, document);
    

    【讨论】:

    • 好吧,您是否曾经编写过没有根元素的“XML”文档并将其加载到 DOM 树中?有点奇怪的是,您期望使用应该返回 DOM 文档的方法 transformToDocument 发生这种情况,您使用 XSLT 创建的结果是 XSLT 可以产生的一种结果,但它肯定不是 XML 文档,缺少任何根元素。由于 XSLTProcessor 的 JavaScript API 是基于树/节点的,并且不提供直接的方法来简单地使用 transformToFragment 给出序列化结果,这并不是真正的解决方法,而是您想要的结果类型的逻辑方法。
    • XSLT 应该产生 XML,,不是吗?
    • 我不知道您认为 XML 是什么,但您显示的结果肯定不是 XML 文档 (w3.org/TR/xml/#sec-well-formed)。 XSLT 输出方法xml 既不需要也不确保您获得 XML 文档,而是 w3.org/TR/xslt-10/#section-XML-Output-Method 表示“xml 输出方法将结果树输出为格式良好的 XML 外部通用解析实体”,它在XML 规范 w3.org/TR/xml/#NT-extParsedEnt 但不是 XML 文档。 DOM 世界中相关的树结构是一个文档片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2016-08-25
    • 2020-12-31
    • 1970-01-01
    • 2019-02-09
    • 2013-05-21
    相关资源
    最近更新 更多