1

在我的项目中,我有一堆用于用户界面和字符串翻译的 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 领域中,还是我需要做其他事情?

4

1 回答 1

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
于 2012-06-19T06:31:18.910 回答