如何在XSLT之后保留空XML标记 – 防止它们从 折叠到
假设我有一个非常简单的XML,带有空标记’B’:
foo bar
我目前正在使用XSLT删除一些标签,例如’C’:
到目前为止还好,但问题是我最终得到这样的输出:
foo
当我真正想要的时候:
foo
有没有办法阻止’B’崩溃?
谢谢。
好的,所以这里对我有用:
尝试这个:
您的HTML输出将是:
防止折叠但转换为空白区域。 它过去对我有用。
没有标准的方法,因为它们是等价的; 您可能能够找到具有此行为选项的XSLT引擎,但我不知道。
如果您将此传递给使用此语法无法接受空标记的第三方,则您可能必须自己对输出进行后处理(或说服第三方修复其XML解析)
由XSLT引擎决定如何呈现XML标记,因为解析器应该看到两个变体之间没有区别。 但是,在输出HTML时,这是一个常见问题(例如,对于和
标签。)最简单(但很难看)的解决方案是在标签内添加一个空格(这确实会略微改变标签的含义)虽然。)
这是一个长期问题,我终于使用一个简单的解决方案。 如果您有空格字符,请添加
它们并不总是等同的。 许多浏览器无法处理并且想要一个单独的结束标记。 我在使用PHP的xml / xsl时遇到了这个问题。 输出“html”不起作用,我仍在寻找解决方案。
还应该有另一种方法(仅限XSLT2?):“xhtml”( 参见另一个线程 )。 这样可以防止标记崩溃,也不会从等元素中删除结束标记。
不。这两个在语法上是相同的,所以你不必担心
如果它是或者它应该不是问题 。 但是,如果您正在使用另一个需要空XML标记的工具 只有方式,然后你有一个问题。 一个不太优雅的方法是通过XSLT代码在凝视和结束’B’标签之间添加一个空格。
这适用于C#的带有.Net 2.0的XslCompiledTransform
类,但几乎可能在其他任何地方都失败了。 除非您自己以编程方式执行transofrm,否则请勿使用; 它根本不便携。
这已经晚了7年,但对于未来的读者,我将在这里摒弃这一趋势并提出原始问题的实际解决方案。 不使用空格或输出指令修改原始文件的解决方案。
我的想法是使用一个空变量来欺骗解析器。
如果你只想为一个标签B做这个,我首先想到的是用这样的东西来附加一个虚拟变量。
但事实上,我发现即使是虚拟变量也是不必要的。 这保留了空标记,至少在linux中使用xsltproc
进行测试时:
有关处理所有空标记的更通用的解决方案,请尝试以下方法:
同样,根据解析器的智能程度,您甚至可能不需要虚拟变量。