使用命令行工具“缩小”XML的简明方法?

时间:2012-06-13 09:52:44

标签: xml build-automation

我有一堆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>标记中。< / p>

我当前的解决方案是使用grep来删除XML prolog,打开每个文件中的messages标记和关闭消息标记,并在连接XML prolog和打开消息之后将结果连接到新文件,然后最终连接结束消息标记。这个解决方案......相当混乱,容易出错。

那么,我如何使用任何命令行XML工具来自动执行此过程?我可以使用xmlpatterns和/或XSL转换吗?

附带问题:如何验证每个<message>标记是否具有ID属性,并且最终文档中的所有ID属性值都是唯一的?我知道我可以通过DTD做第一部分,但是第二部分也是在DTD领域或者我还需要做其他事情吗?

1 个答案:

答案 0 :(得分: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,Qt恰好包含一个名为xmlpatterns的工具,它可以执行XSL转换。所以我能够在构建过程中包含以下命令,并在每次构建时自动“缩小”我的XML文件。

xmlpatterns merge-messages.xsl messages-index.xml -output messages.xml
相关问题