XmlMassUpdate - как НЕ добавлять xmlns?
Я использую Nightly build 1.3.0.477 из задач сообщества MSBuild, и у меня возникла проблема с XmlMassUpdate.
Вот что я хочу сделать:
для каждого проекта, если он не ссылается на файл CommonAssemblyInfo.cs, добавьте эту ссылку.
Я делаю это так:
<Message Text="Path is $(MSBuildCommunityTasksPath)" Importance="normal" />
<!---->
<XmlMassUpdate ContentFile="%(DotNetProjects.FullPath)"
ContentRoot="msb:Project/msb:ItemGroup[2]/msb:Compile[1]"
NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003"
SubstitutionsFile="$(BuildFolder)CommonAssemblyInfo.substitution"
SubstitutionsRoot="ItemGroup/Compile" />
мой файл подстановки выглядит так:
<ItemGroup>
<Compile Include="..\..\CommonAssemblyInfo.cs" >
<Link>Properties\CommonAssemblyInfo.cs</Link>
</Compile>
</ItemGroup>
проблема в том, что когда я запускаю цель, она добавляет пустые xmlns в тег Link, что недопустимо.
<ItemGroup>
<Compile Include="Class1.cs">
<Link xmlns="">Properties\CommonAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
Как мне сказать это не делать это?
1 ответ
Короткий ответ: вы не можете, задача замены всегда использует пустое пространство имен, даже если узел файла подстановки имеет пространство имен.
смотрите: строка 380 в XmlMassUpdate.cs destinationParentNode.AppendChild(mergedDocument.CreateNode(XmlNodeType.Element, nodeToModify.Name, String.Empty)
В качестве альтернативы вы можете использовать задачу XSLT для преобразования XML-файла.
Я включил базовый пример того, как это можно сделать, но я не особо разбираюсь в XSLT, поэтому его немного взломали вместе.
<xsl:stylesheet
version="1"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output indent="yes"
standalone="yes"
method="xml"
encoding="utf-8"
/>
<xsl:template match="/msb:Project/msb:ItemGroup[1]">
<ItemGroup>
<Compile Include="..\..\CommonAssemblyInfo.cs">
<Link>Properties\CommonAssemblyInfo.cs</Link>
</Compile>
</ItemGroup>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
И в файле сборки.
<Xslt Inputs="input.xml"
Output="output.xml"
Xsl="transform.xslt"
/>