xslt - 用于复制使用 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>
任何帮助表示赞赏。
解决方案
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/
推荐阅读
- arrays - MIPS中的程序,它打印数组中最小值索引和最大值索引之间的所有元素
- ubuntu-20.04 - 如何将 Windows Ubuntu20.04 LTS 连接到我的 Xming 服务器
- php - 目前无法处理此请求。HTTP ERROR 500 在源代码中找不到错误
- .net - 从 Travis 构建服务器运行 docker-compose up
- python - 是否可以从 C# Form App 运行 Anaconda 脚本?
- async-await - 我在第 10 行收到了一个断言错误,即“预期未定义等于 '2 sec'”......为什么会这样?
- ios - 从随机字典键值创建数组
- javascript - Json / Discord.js:将基于输入的内容添加到 json 文件
- c# - NuGet 包 Microsoft.Toolkit.Uwp.Notifications 版本 7.0.2 无法识别 UWP TileContent
- mysql - mysql数据库表的foregin键中的自动inrement不起作用