2013-03-08 78 views
0

我有几个(〜5)大(〜1000线)与许多元素类似这样的XML文件:更改空XML元素与自闭标签元素

<Foo Bar="Baz"> 
</Foo > 

我希望它们都变成这样这个:

<Foo Bar="Baz" /> 

是否有工具或脚本会自动为我做这个?注意:有些元素不是空的,不应该改为自闭标签;我只关心大约5个不同的元素名称。

+0

“大”有多大?而且“很多”元素都具有相同的名称还是有所不同? – 2013-03-08 18:12:37

+0

约1,000-2,000行。没有足够的麻烦一台电脑,但足够乏味手动去做。只有大约6个不同的名字。请注意,具有这些名称的某些元素不是空的,不应将其更改为自关闭标签。 – Daryl 2013-03-08 18:44:21

回答

1

如果您有xsltproc或其他XSLT处理器,那么这应该是非常简单的。现在,您在问题中显示的示例元素实际上并不是空的,因为它包含文本节点(换行符)。但XSLT允许您指定仅可以忽略空白文本节点的元素。因此,这样的样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:strip-space elements="Foo Bar Baz"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

应该做你需要的。 strip-space告诉它哪些元素应该仅删除仅含空白的文本节点子元素,并且该模板是将输入复制为输出的恒等变换(之后在分析时发生的空白剥离)。一旦元素真的是空的,串行器应该把它们写成自封闭的标签。

+1

我不认为XSLT 1.0指定序列化器必须使用自闭标签,但它几乎肯定会。 – 2013-03-09 09:29:48

+0

'xsltproc'肯定会为空元素使用自闭标签,我刚刚测试过这个。 – 2013-03-09 11:06:07