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>

ビルドプロセスの一環として、これらのファイルを1つのXMLファイルに「縮小」したいと思います。これにより、各<message>タグとそのすべての子が<messages>タグ内に埋め込まれます。

私が持っている現在の解決策は、grepを使用してXMLプロローグをリッピングし、各ファイルからメッセージタグを開いてメッセージタグを閉じ、XMLプロローグを連結してメッセージを開いた後、結果を新しいファイルに連結し、最後に終了メッセージを連結することです鬼ごっこ。この解決策は...かなり厄介でエラーが発生しやすいです。

では、コマンドラインXMLツールを使用してこのプロセスを自動化するにはどうすればよいですか?xmlpatternsやXSL変換のようなものを使用できますか?

<message>副次的な質問:各タグにID属性があり、最終的なドキュメントのすべてのID属性値が一意であることを確認するにはどうすればよいですか?私はDTDを使用して最初の部分を実行できることを知っていますが、2番目の部分も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>

<message>次に、インデックスファイルにリストされている各ファイルからタグを選択するXSL変換を作成しました。

<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には、XSL変換を実行できるxmlpatternsというツールが含まれています。そのため、ビルドプロセスに次のコマンドを含めて、ビルドごとにXMLファイルを自動的に「縮小」することができました。

xmlpatterns merge-messages.xsl messages-index.xml -output messages.xml
于 2012-06-19T06:31:18.910 に答える