次のようなサンプルxmlファイルがあります。
--- before transformation ---
<root-node>
<child-type-A> ... </child-type-A>
<child-type-A> ... </child-type-A>
<child-type-B> ... </child-type-B>
<child-type-C>
<child-type-B> ... </child-type-B>
...
</child-type-C>
...
</root-node>
このxmlファイルを次のようなものに変換したいと思います:
--- after transformation ---
<root-node>
<child-node> ... </child-node>
<child-node> ... </child-node>
<child-node> ... </child-node>
<child-node>
<child-node> ... </child-node>
...
</child-node>
...
</root-node>
これは事実上、文書構造は同じままですが、「選択された」要素の名前が変更されることを意味します。これらの選択された要素は、同じプレフィックス (この例では "child-type-") で始まりますが、さまざまなサフィックス ("A" | "B" | "C" | など) があります。
なぜこのすべての面倒なのですか?入力として xml ファイルを要求するソフトウェアがあります。便宜上、XML スキーマを使用して xml ファイルを簡単に編集します。スキーマは、xml ファイルが正しいことを確認するのに役立ちます。悲しいことに、XML スキーマには、コンテキスト依存の側面に関してはいくらか欠けています。これにより、xml ファイルは /before conversion/ に示されているようになります。ソフトウェアは、/after conversion/ に示されているようなファイルを想定しているため、このような xml ファイルを処理できません。したがって、変換の必要性。
XSLT を使用して変換を行いたいのですが、その方法は既にわかっています。私のアプローチは、恒等変換のルールを定義し、名前を変更する必要がある「child-type-*」要素ごとに 1 つのルールを定義することでした。このソリューションは機能しますが、それほどエレガントではありません。たくさんのルールができあがります。
--- sample transformation rules ---
<!-- Identity transformation -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="child-type-A">
<xsl:element name="child-node">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
...
それを2つのルールだけに凝縮する方法はありますか? 1 つは恒等変換用で、もう 1 つはすべての「child-type-*」要素用ですか? XSLT を何らかの正規表現と組み合わせて使用することでしょうか? それとも、そのような問題に取り組むために別のアプローチを取る必要がありますか?