首页 > 解决方案 > 用于复制使用 document() 加载的 XML 文件的正确 XSLT 语法

问题描述

我正在用这个扯掉我的头发,感谢任何帮助。

使用 document() 将 XML 文件加载到 XSLT 中进行处理的正确语法是什么?只是为了排除故障,我一直在使用以下内容,但是当我希望输出 $File 的内容时,什么也没有输出。我想不通为什么?我觉得我一定遗漏了一些明显的东西。

正在处理的 XML 文件

<FileUpload/>

XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:param name="File"/>
<xsl:template match="/FileUpload">
    <FileUpload>
        <xsl:comment>
            <xsl:copy-of select="document($File)/Root"/>
        </xsl:comment>
    </FileUpload>
</xsl:template>

$文件的内容

<?xml version="1.0" encoding="windows-1252"?>
<Root><RECORD/></Root>

我期望输出的内容

<FileUpload>
<!--<Root><Record/></Root>-->
</FileUpload>

实际输出的是什么

<?xml version="1.0" encoding="utf-8"?>
<FileUpload><!----></FileUpload>

任何帮助表示赞赏。

标签: xslt

解决方案


xsl:comment 指令与 xsl:attribute 和 xsl:text 一样,通过获取其字符串值将提供的 XML 节点转换为字符串。元素或文档节点的字符串值是其所有后代文本节点的串联:在您的示例中,没有任何后代文本节点,因此结果注释为空。

您想要的是一个注释,其内容是文档的 XML 序列化。在 XSLT 3.0 中,您可以使用

<xsl:comment>{
  serialize(document($File), map{'method':'xml')
}</xsl:comment>

或者,您可以简单地将其复制为未解析状态,而不是解析和重新序列化文档:

<xsl:comment>{
  unparsed-text($File)
}</xsl:comment>

在 XSLT 1.0 中,您需要处理器扩展来实现这一点。或者您可以使用用 XSLT 编写的序列化程序:例如参见http://lenzconsulting.com/xml-to-string/


推荐阅读