如何在XSLT之后保留空XML标记 – 防止它们从 折叠到

假设我有一个非常简单的XML,带有空标记’B’:

 foo  bar  

我目前正在使用XSLT删除一些标签,例如’C’:

            

到目前为止还好,但问题是我最终得到这样的输出:

  foo   

当我真正想要的时候:

  foo   

有没有办法阻止’B’崩溃?

谢谢。

好的,所以这里对我有用:

  

尝试这个:

  

您的HTML输出将是:

  

  防止折叠但转换为空白区域。 它过去对我有用。

没有标准的方法,因为它们是等价的; 您可能能够找到具有此行为选项的XSLT引擎,但我不知道。

如果您将此传递给使用此语法无法接受空标记的第三方,则您可能必须自己对输出进行后处理(或说服第三方修复其XML解析)

由XSLT引擎决定如何呈现XML标记,因为解析器应该看到两个变体之间没有区别。 但是,在输出HTML时,这是一个常见问题(例如,对于标签。)最简单(但很难看)的解决方案是在标签内添加一个空格(这确实会略微改变标签的含义)虽然。)

这是一个长期问题,我终于使用一个简单的解决方案。 如果您有空格字符,请添加。 我在助手class中添加了一个空格。

它们并不总是等同的。 许多浏览器无法处理并且想要一个单独的结束标记。 我在使用PHP的xml / xsl时遇到了这个问题。 输出“html”不起作用,我仍在寻找解决方案。

还应该有另一种方法(仅限XSLT2?):“xhtml”( 参见另一个线程 )。 这样可以防止标记崩溃,也不会从等元素中删除结束标记。

不。这两个在语法上是相同的,所以你不必担心

如果它是或者它应该不是问题 。 但是,如果您正在使用另一个需要空XML标记的工具 只有方式,然后你有一个问题。 一个不太优雅的方法是通过XSLT代码在凝视和结束’B’标签之间添加一个空格。

  
]]>

这适用于C#的带有.Net 2.0的XslCompiledTransform类,但几乎可能在其他任何地方都失败了。 除非您自己以编程方式执行transofrm,否则请勿使用; 它根本不便携。

这已经晚了7年,但对于未来的读者,我将在这里摒弃这一趋势并提出原始问题的实际解决方案。 不使用空格或输出指令修改原始文件的解决方案。

我的想法是使用一个空变量来欺骗解析器。

如果你只想为一个标签B做这个,我首先想到的是用这样的东西来附加一个虚拟变量。

        

但事实上,我发现即使是虚拟变量也是不必要的。 这保留了空标记,至少在linux中使用xsltproc进行测试时:

       

有关处理所有空标记的更通用的解决方案,请尝试以下方法:

         

同样,根据解析器的智能程度,您甚至可能不需要虚拟变量。