哪种方法可以更好地删除XML中的冗余空格[strip-space或indent =“no”]?

时间:2010-02-26 13:13:35

标签: xml xslt

我想在一行[在记事本或其他简单的文本编辑器中查看]打印输出xml,以便删除xml文件中的冗余空白区域。那么哪个更好的方法呢?

我认为有两种选择,
1)使用

  <xsl:output method="xml" indent="no"/>

2)或使用

  <xsl:strip-space elements="*"/>

哪个更有效率,为什么?
有些人建议我使用indent="no"

我认为条形空间最适合,但由于其他人给出的建议而不确定。

为了更详细说明,让我举一个例子:
输入XML:

<root>
 <node>
   <child1/>
   <child2/>
 </node>
</root>

,所需的输出为:

<root><node><child1/><child2/></node></root>

2 个答案:

答案 0 :(得分:12)

为了消除任何看起来像“缩进”的内容,可能有必要(这意味着有时需要)使用两者 <xsl:strip-space> ``indent =“no”`

采用最简单的示例:您拥有身份转换。如果没有指定任何两种方法,转换将从源XML文档重现仅空白空间的文本节点。也就是说,如果源XML文档是缩进的,那么转换也会产生缩进结果。

现在,添加到此转换<xsl:output indent="no" />这指示XSLT处理器不要执行自己的“漂亮打印”。但是,源XML文档中仅包含空格的节点仍然复制到输出,结果文档看起来仍然是缩进的(因为源文档是缩进的)。

现在,作为最后一步,添加<xsl:strip-space elements="*"/>您已指定两种方法来阻止输出中仅限空白的节点。怎么了? XSLT处理器根本不处理只有空格的节点,它不会缩进输出 - 您可以得到所需的单行密集输出。

最后,进行回归,将<xsl:output indent="no" />更改为<xsl:output indent="yes" /> <xsl:strip-space elements="*"/>仍然存在,因此不会再生成只有空格的节点输出。但是XSLT处理器遵循<xsl:output indent="yes" />指令并添加了自己的纯空文本节点。

因此,从四种可能的组合中,只指定 <xsl:strip-space elements="*"/><xsl:output indent="no" />可确保不会从空格中导致缩进 - 仅来自源XML文档或XSLT处理器计划的节点。

当然,即使这最后一种情况也不能完全保证输出不会缩进 - 如果XSLT程序员故意将缩进代码放在

<xsl:text>

</xsl:text>

输出将包含此缩进。

答案 1 :(得分:2)

最佳测量性能差异。 XSLT处理器的实现有所不同,您应该自己进行测试(尽管我怀疑在这种情况下担心这一个或那个的性能可能属于“过早优化”类别)。

除非附有

,否则

<xsl:output indent="no" />可能没有您想要的效果

<xsl:template match="text(normalize-space()='')" />

因为如果没有删除空白节点(标记之间的节点),那么无论“输出”设置如何,它们都会在某个点出现在输出中。