在作为嵌入式资源的resx文件上使用TransformXml任务

时间:2012-08-23 23:46:11

标签: .net asp.net-mvc-3 resx xdt-transform

有没有人有过在resx文件上执行xml转换的经验?我想为每个配置转换一个resx文件。每个配置的转换文件可以替换资源文件中的某些字符串值。例如:

<None Include="Resources\Label.Release.resx.config">
  <DependentUpon>Label.resx</DependentUpon>
</None>
<EmbeddedResource Include="Resources\Label.resx">
  <Generator>PublicResXFileCodeGenerator</Generator>
  <LastGenOutput>Label.Designer.cs</LastGenOutput>
</EmbeddedResource>

我正在尝试转换resx文件中的一些数据值。 在Label.Release.resx.cofing中:

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <data name="Title" xml:space="preserve"  xdt:Locator="Match(name)">
    <value  xdt:Tranform="Replace">CEO</value>
  </data> 
</root>

我尝试在BeforeBuild任务中使用它:

<Target Name="BeforeBuild">
<MakeDir Directories="$(IntermediateOutputPath)\Resources" 
    Condition="!Exists('$(IntermediateOutputPath)\Resources')"/>
<TransformXml Source="Resources\Label.resx" Transform="Resources\Label.$(Configuration).resx.config" Destination="$(IntermediateOutputPath)\Resources\Label.resx" />

Label.resx导致$(IntermediateOutputPath)\ Resources文件夹之后没有转换。我也不确定这是否是我将输出转换结果的位置,因为Lable.resx最终应该是一个嵌入式resorce。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

这是我最终做的事情:

<Target Name="TransLabel">
<MakeDir Directories="$(IntermediateOutputPath)\Resources" Condition="!Exists('$(IntermediateOutputPath)\Resources')" />
<TransformXml Source="Resources\Label.resx" Transform="Resources\Label.$(Configuration).resx.config" Destination="$(IntermediateOutputPath)\Resources\Label.resx" />
<GenerateResource Sources="$(IntermediateOutputPath)\Resources\Label.resx" OutputResources="@(Resx->'$(IntermediateOutputPath)%(Identity).resources')">
</GenerateResource>
<Copy OverwriteReadOnlyFiles="true" SourceFiles="$(IntermediateOutputPath)\Resources\Label.resources" DestinationFiles="$(IntermediateOutputPath)\Ccwa.Resources.Label.resources" />
<RemoveDir Directories="$(IntermediateOutputPath)\Resources" />
</Target>

<Target Name="AfterResGen">
<CallTarget Targets="TransLabel" />

我通过挂钩到AfterResGen目标来转换resx文件,在该目标中发生了正常的资源生成过程。然后我执行自己的转换并生成自己的资源文件。然后我替换在转换之前已经生成的那个。当构建继续并生成项目dll时,我的已转换资源文件将被选中。