因爲我的實際轉換相對簡單的我開發了這個XSL轉換:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="xformPath">web.Prod.config</xsl:variable>
<xsl:variable name="xform" select="document($xformPath)"></xsl:variable>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="output-transform">
<xsl:param name="xformNode" />
<xsl:variable name="key" select="@key" />
<xsl:choose>
<xsl:when test="$xformNode">
<xsl:copy-of select="$xformNode" />
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/configuration/appSettings/add">
<xsl:variable name="key" select="@key" />
<xsl:call-template name="output-transform">
<xsl:with-param name="xformNode" select="$xform/configuration/appSettings/add[@key=$key]" />
</xsl:call-template>
</xsl:template>
<xsl:template match="/configuration/connectionStrings/add">
<xsl:variable name="name" select="@name" />
<xsl:call-template name="output-transform">
<xsl:with-param name="xformNode" select="$xform/configuration/connectionStrings/add[@name=$name]" />
</xsl:call-template>
</xsl:template>
<xsl:template match="/configuration/system.web/customErrors">
<xsl:call-template name="output-transform">
<xsl:with-param name="xformNode" select="$xform/configuration/system.web/customErrors" />
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
這具有一些明顯的缺點,
- 項目要更換必須手動定義
- 替換整個元素,不僅指定的屬性
- 不維護兒童元素(例如我試圖改變
system.web/[email protected]
到false
但我失去了我所有的system.web/compilation/assemblies
項)
我計劃增加這一個命令行一步,我的Visual Studio生成步驟和複製文件的步驟之間,並呼籲無論是MSXSL.EXE或撒克遜的HE變換引擎。
您應該將項目更改爲Web應用程序以獲得更多功能以及應用程序的穩定性和一致性。 –
CeCe的解決方案是否能解決您的問題? –
我不認爲它會,因爲它需要一個額外的基本文件(導致在開發過程中使用的web.config在構建過程中不被引用),或者它需要將令牌存儲在web.config中文件本身,在開發過程中渲染web.config是無用的,除非只添加了本地後構建步驟,也可以在本地執行替換令牌(如果我正確理解插件)。 – mlhDev