【问题标题】:How to use MSbuild property in TransformXml task?如何在 TransformXml 任务中使用 MSbuild 属性?
【发布时间】:2026-02-16 21:00:02
【问题描述】:

我正在使用 MsBuild 和 TransformXml 任务来设置一些 web.config 文件。这一切都很好,但现在我想在 xml 转换中扩展一个 MSBuild 属性。

为了更清楚,我使用 itemgroup 批处理 TransformXml 任务,为配置不同的多个网站进行多次转换:

<PropertyGroup>
  <WebsiteTargetDirectory>$(MSBuildProjectDirectory)\BUILD\</WebsiteTargetDirectory>
</PropertyGroup>

<ItemGroup>
  <WebsitesToBeCopied Include="CH;DE;EN">
    <InProject>false</InProject>
  </WebsitesToBeCopied>
</ItemGroup>

<target name="CreateWebConfigs">
  <TransformXml
    Source="$(MSBuildProjectDirectory)\Web.Template.config"
    Transform="$(MSBuildProjectDirectory)\Web.%(WebsitesToBeCopied.Identity).config"
    Destination="$(WebsiteTargetDirectory)\%WebsitesToBeCopied.Identity)\Web.config"
  />
</target>

这工作得很好,但如果有可能在转换中获得一些 MSBuild 属性,我可以省去几行和转换。例如,我需要将“DE”、“EN”或“CH”附加到属性值,最好在模板中简单地使用占位符,而不是为每个 web.config 编写转换。

有没有办法实现这一点,如果有,那将如何工作?

【问题讨论】:

  • 我自己找到了一个解决方法。在 TransformXml 完成之后,我可以在第二步中使用 MSBuildExtensionPack 中的 Detokenize 任务将变量放入文件中。
  • 你现在应该可以回答了。两天后你就可以选择它作为正确答案了。

标签: msbuild properties xslt


【解决方案1】:

我自己找到了解决方法。

在TransformXml 任务之后,我可以在第二步中使用MSBuildExtensionPack 中的Detokenise 任务将我的变量放入转换后的文件中。我只需要在文件中使用原始 $(PropertyName) 语法作为占位符,其他任务会自动替换它们。

【讨论】:

  • 这也是我过去使用的解决方案(抱歉我之前没有回复!)。请注意,Detokenise 任务有一个限制,因为它不会提供从调用者传入的任何属性,例如MSBUILD 命令行。如果你需要它,我已经开发了一个我可以发布的解决方法。