为啥我的标签在 XSLT 转换后展开(以及如何修复)?

Posted

技术标签:

【中文标题】为啥我的标签在 XSLT 转换后展开(以及如何修复)?【英文标题】:Why are my tags expanded after XSLT transform (and how to fix)?为什么我的标签在 XSLT 转换后展开(以及如何修复)? 【发布时间】:2013-09-09 14:07:40 【问题描述】:

我有来自 SQLServer 的 XML。我无法让 SQLServer 让我有条件地更改节点的名称,所以我稍后使用 XSLT 进行。我真的不知道我在用 XSLT 做什么——我根据在 *** 上搜索到的东西拼凑了我的解决方案。我遇到的问题是输入中没有子级的标签(因此只有一个标签)在转换后扩展为具有开始和结束标签。我想防止这种情况发生,因为我们有足够的用户,带宽是一个问题。

输入是:

N控件> SJ-CVS-Section-MgtSJ-CVS-MgtSJ-CVS-Mgt-SS问题> 问题> 问题> 组> 序列> 路径> ... 组> 序列> 路径> 反馈-CVS问题> 组> 序列> 路径> 路径> 评估数据>

XSLT 是

【问题讨论】:

我猜这两个问题都不是来自您编写的 XSLT,而是来自 XSLT 处理器本身。请指定您正在使用的处理器以及所涉及的所有参数。 编辑地址评论 我可以支持哈维尔的回复。这很可能是由您的处理器引起的。我使用 Xalan 运行了提供的转换,但我没有看到 XML 被“爆炸”或 UTF-16 问题。 另外,您可以通过 encoding="UTF-8" 或其他方式在输出标签中设置您的编码。但这只能解决其中一个问题。 【参考方案1】:

由于某种原因,从 Msxml2.DomDocument.3.0 更改为 Msxml2.DomDocument.6.0 解决了第一个问题。即使在 XSLT 中设置编码也不能解决第二个问题(这似乎是 transformNode 的一个已知问题)。相反,我使用了 omit-xml-declaration="yes",它实际上并没有省略 XML 声明,而是省略了编码值。就我的用途而言,这对我来说已经足够了。

【讨论】:

Msxml2 是相当古老的历史,但我似乎记得它用空格做了一些讨厌的事情。我的猜测是,它没有按应有的方式从样式表中删除所有空格,而是将一些空格复制到您的结果文档中,这意味着问题元素不是空的,但实际上包含一个空格文本节点,这可以防止它们被使用自闭合标签进行序列化。 至于编码问题,我的猜测是您将 XSLT 输出写入 DOM 树,然后使用 DOM 序列化器序列化回词法 XML,而不是让 XSLT 处理器进行序列化直接地。 (但我可能错了。没有显示的代码很难调试。) 是的,让我跳上我的时间机器,利用你的 cmets :) 我有时真希望 SO 还没有准备好带你去一个看起来就像昨天问的问题的古老帖子...... 如果你要评论一个版本是古代历史,你必须承认,看看帖子上的日期是值得的:-D

以上是关于为啥我的标签在 XSLT 转换后展开(以及如何修复)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在</Underline>标签后检查换行符(&#10)并需要替换为xslt代码中的<br/>标签

如何将 word 文件转换为 markdown 文件

为啥在 XSLT 转换期间出现此错误:XSLT 转换失败?

如何使用 XSLT 从 XML 中删除元素标记

为啥我需要静态修饰符以及如何修复它?

XSLT 如何从不同的标签级别访问属性?