Search code examples
xslttemplatescopymode

XSL How to copy identical + add copy with attributes changes


I need to copy a node and its sub-nodes:

  • first: one identical copy
  • followed by a modified copy with some attributes values changed

Here is the extract to change:

<Configuration
    Name="Debug|Win32"
    OutputDirectory=".\Debug"
    IntermediateDirectory=".\Debug"
    ATLMinimizesCRunTimeLibraryUsage="FALSE"
    CharacterSet="2">
    <Tool
        Name="VCCLCompilerTool"
        Optimization="0"
        BasicRuntimeChecks="3"
        RuntimeLibrary="1"
        AssemblerListingLocation=".\Debug/"
        ObjectFile=".\Debug/"
        ProgramDataBaseFileName=".\Debug/"
        WarningLevel="4"
        SuppressStartupBanner="TRUE"
        DebugInformationFormat="4"
        CompileAs="0"/>
</Configuration>

In the second copy I need to change all "Debug" to "Release" and some attribute values also.

Thanks


Solution

  • Thanks Koynov

    I found however a solution using template modes:

    <xsl:template match="Configuration[@Name='Debug|Win32']">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <xsl:copy>
            <xsl:attribute name="WholeProgramOptimization">TRUE</xsl:attribute>
            <xsl:apply-templates select="@*|node()" mode="Release"/>
        </xsl:copy>
    </xsl:template>
    

    With this template for all attributes:

        <xsl:template match="@*" mode="Release">
        <xsl:attribute name="{local-name()}">
            <xsl:call-template name="replace-string">
                <xsl:with-param name="text"     select="."/>
                <xsl:with-param name="replace"  select="'Debug'"/>
                <xsl:with-param name="with"     select="'Release'"/>
            </xsl:call-template>
        </xsl:attribute>
    </xsl:template>
    

    and of-course the "replace-string" template.

    Thanks again.