代码之家  ›  专栏  ›  技术社区  ›  Krzysztof Kozmic

XmlMassUpdate-如何不添加xmlns?

  •  1
  • Krzysztof Kozmic  · 技术社区  · 16 年前

    我正在使用MSBuild社区任务的Nightly build 1.3.0.477,但XmlMassUpdate出现问题。

    以下是我想做的:

    <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 回复  |  直到 16 年前
        1
  •  2
  •   Chris Chilvers    16 年前

    简短的回答是,你不能,即使替换文件的节点有一个命名空间,替换任务也总是使用空的命名空间。

    请参见XmlMassUpdate.cs中的第380行 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"
          />
    
    推荐文章