私が思ったOPを読んで:Visual Studioプロジェクト内の任意のxmlファイル(このファイルを変換するためのXSLファイル)に関連付けることができるのは素晴らしいことではないでしょうか。この変換の結果は、*。xaml.csが* .xamlの下に表示されるように、元のxmlファイルの下にサブアイテムとして表示されます。また、プロパティを使用して、この新しいxmlファイルに任意のビルドアクションを割り当てることができます。
これは現在は不可能ですが、別のより一般的な前処理手法であるT4が存在します。これは、「私たちの」xmlフラグメントを「彼らの」生成されたxmlファイルに挿入するためにそれを使用する方法の説明です。
1)「彼らの」生成されたxmlファイルがaaa.xmlという名前でプロジェクトに含まれていると仮定しましょう。
例: aaa.xml:
<?xml version="1.0" encoding="utf-8"?>
<abc>
<data a="1"/>
<data a="2"/>
<placeholderForTranslations/>
<data>ccc</data>
</abc>
ここで、placeholderForTranslations要素は「our」フラグメントで置き換える必要があります。
2)placeholderForTranslationsを「our」フラグメントに置き換えることでaaa.xmlを変換するaaa.xsltファイルをプロジェクトに追加しましょう。
aaa.xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="placeholderForTranslations">
<translations>
<trans orig="aaa" translated="AAA"/>
</translations>
</xsl:template>
</xsl:stylesheet>
ここでの最初のxsl:templateは、デフォルトでは、変換エンジンが入力ファイルのノードを通過するときに、それらをそのまま出力にコピーすることを示しています。2番目のテンプレートは、placeholderForTranslations要素が検出された場合に、ここでテンプレートに埋め込まれたxmlのフラグメントを使用してplaceholderForTranslations要素を置き換えることを示しています。実際、必要に応じて、このフラグメントが別のファイルからも読み取られるように、*。ttファイル(以下を参照)を変更することができます。
3)aaa1.tt--t4コードプリプロセッサファイルをプロジェクトに追加しましょう。
aaa1.tt:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".xml" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Xml.Xsl" #>
<#
string origXmlPath = Host.ResolvePath("aaa.xml");
string transformPath = Host.ResolvePath("aaa.xslt");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(transformPath);
MemoryStream stream = new MemoryStream();
transform.Transform(origXmlPath, null, stream);
byte[] generated = stream.ToArray();
string generatedString = Encoding.UTF8.GetString(generated);
#>
<#= generatedString #>
<#と#>の間に、aaa.xmlとaaa.xsltへのフルパスを見つけてaaa.xslt変換をaaa.xmlファイルに適用し、その結果をgeneratedString変数に入れるC#コードの一部を見ることができます。次に、<#= GeneratedString#>を使用して、generatedStringのコンテンツが出力ファイルに挿入されます。
これらの手順を実行すると、Visual Studioでのaaa1.ttの最初の保存時に、ファイルaaa1.xmlがaaa1.ttのサブアイテムとして作成されます。プロパティを介してこのファイルに、「埋め込みリソース」などのビルドアクションを割り当てることができます。aaa.ttを右クリックして[カスタムツールの実行]を選択することにより、いつでもaaa1.xmlの再生成を強制することができます。また、ソリューションを構築するときに常に再生成されます。
このアプローチの利点は、マージされたファイルがアプリケーションの実行時ではなく、コンパイル時に生成されることだと思いました。そのため、開発中にファイルを視覚的に検査できます。