我有一堆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领域或者我还需要做其他事情吗?
答案 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