由于IIS 7中的处理程序部分已移至另一部分,因此我希望在TFS构建过程中自动移动这些部分。 在那种情况下,我可以同时服务于IIS 6.5和7.x环境。
我想通过使用XSLT来执行以下操作:
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.New" type="MyHandler.New,MyHandler"/>
<add verb="GET,HEAD" path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll"/>
</httpHandlers>
<system.web>
</configuration>
必须翻译为:
<configuration>
<system.web>
</system.web>
<system.webServer>
<handlers>
<add name="handler 1" verb="*" path="*.New" type="MyHandler.New,MyHandler"/>
<add name="handler 2" verb="GET,HEAD" path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll"/>
</handlers>
<system.webServer>
</configuration>
任何人都可以通过制作XSLT来帮助我,或者指出我正确的方向吗? (另请注意:第二个xml中的额外atrribute [name])
我知道如何轻松翻译,但在de xml中移动节点集合更难。 感谢。
答案 0 :(得分:1)
这应该这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="system.web">
<system.web>
<xsl:text>
</xsl:text>
</system.web>
<system.webServer>
<handlers>
<xsl:apply-templates select="httpHandlers/*" />
</handlers>
</system.webServer>
</xsl:template>
<xsl:template match="system.web/httpHandlers/*">
<xsl:copy>
<xsl:attribute name="name">
<xsl:value-of select="concat('handler ', position())"/>
</xsl:attribute>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在您的示例输入上运行时(在关闭<system.web>
上缺少斜杠之后),这会产生:
<configuration>
<system.web>
</system.web>
<system.webServer>
<handlers>
<add name="handler 1" verb="*" path="*.New" type="MyHandler.New,MyHandler" />
<add name="handler 2" verb="GET,HEAD" path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll" />
</handlers>
</system.webServer>
</configuration>
<xsl:text>
</xsl:text>
可能不是必需的,但是您的示例在输出中的单独行上有开始和结束<system.web>
,因此我添加了它以确保它们不会合并为单个短标签( <system.web />
)。