2012-06-13 65 views
1

我有一堆的,我在我的項目中使用的用戶界面和字符串翻譯XML文件,每個文件的結構如下:使用命令行工具「簡化」XML的簡明方法?

<?xml version="1.0" encoding="UTF-8" ?> 
<messages> 
    <message id="x"> 
     <!-- Text node or arbitrary XHTML markup in here --> 
    </message> 
    <message id="y"> 
     <!-- Text node or arbitrary XHTML markup in here --> 
    </message> 
    <message id="z"> 
     <!-- Text node or arbitrary XHTML markup in here --> 
    </message> 
    ... 
</messages> 

由於我的構建過程的一部分,我想「將這些文件縮小爲一個XML文件,從而將每個<message>標記及其所有子標記嵌入<messages>標記中。

我現在使用的解決方案是使用grep來翻譯XML序言,打開每個文件的消息標記和關閉消息標記,並在將XML序言和打開消息連接起來後,將結果連接到一個新文件,最後連接結束消息標籤。這個解決方案...非常混亂,容易出錯。

那麼,如何使用任何命令行XML工具來自動執行此過程?我可以使用xmlpatterns和/或XSL轉換之類的東西嗎?

問題:如何驗證每個<message>標記都具有ID屬性,並且最終文檔中的所有ID屬性值都是唯一的?我知道我可以通過DTD來完成第一部分,但是第二部分也是在DTD領域,或者我需要做其他事情嗎?

回答

1

一些研究和實驗後,我想出了以下解決方案:

首先,我創建了一個XML與所有的XML文件的清單,我想結合在一起:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="merge-messages.xsl"?> 
<bundles> 
    <bundle>file1.xml</bundle> 
    <bundle>file2.xml</bundle> 
    <bundle>file3.xml</bundle> 
    ... 
</bundles> 

然後我寫了一個XSL轉換所選擇的<message>標籤從索引文件中列出的每個文件:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="no" indent="yes"/> 

    <xsl:template match="/bundles"> 
     <messages> 
      <xsl:apply-templates select="document(bundle)/messages/message"/> 
     </messages> 
    </xsl:template> 

    <xsl:template match="message"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

我在我的項目使用Qt和Q t碰巧包含一個名爲xmlpatterns的工具,它可以執行XSL轉換。所以我能夠在構建過程中包含以下命令,並在每個構建中自動「縮小」我的XML文件。

xmlpatterns merge-messages.xsl messages-index.xml -output messages.xml