无外部源文件时如何通过XSL调用内存数据生成XML文件
解决方案
你当前使用空Document作为输入仅输出XML声明的核心原因是:你的XSLT逻辑没有匹配到输入源的根节点规则,默认转换逻辑只会输出XML声明头。你可以选择以下两种不需要依赖外部文件、全程使用内存数据的方案实现需求:
方案1:使用空流作为输入源
如果你的XSLT完全不依赖输入XML的节点内容,仅通过自定义扩展函数生成数据,可以直接传入空的内存流作为输入源,无需构造Document对象:
if (xsltFile != null) { Transformer transformer = getTransformer(xsltFile); // 构造内存空输入源,不需要读取任何外部文件 Source source = new StreamSource(new ByteArrayInputStream(new byte[0])); ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); StreamResult outputTarget = new StreamResult(byteOutputStream); if (transformer != null) { try { transformer.transform(source, outputTarget); rst = new String(byteOutputStream.toByteArray()); } catch (Exception e) { Log.error(this, "Error while transforming xml.", e); } } }
方案2:补充XSLT根节点匹配规则适配空Document输入
如果你要继续使用空Document作为输入源,只需要在XSLT中补充根节点匹配模板,把所有生成逻辑放到该模板内即可:
<!-- 新增根节点匹配规则 --> <xsl:template match="/"> <!-- 原有生成逻辑全部放到这个模板内部 --> <ExternalReference> <xsl:value-of select="erstefnImport:retriveXslExternalReference()" /> </ExternalReference> <!-- 其他需要生成的XML节点也写在这里 --> </xsl:template>
修改XSLT后你之前的DOMSource相关代码就可以正常输出完整XML内容。
核心说明
XSLT转换依赖模板和输入节点的匹配规则,如果你没有定义根节点/的匹配模板,空输入源转换时只会触发默认规则输出XML声明,不会生成你写的固定节点内容。
内容的提问来源于stack exchange,提问作者user3138101
相关产品推荐
相关产品推荐

