2013-03-08 116 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