1

由于 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 中的额外属性 [名称])

我知道如何进行简单的翻译,但在 de xml 中移动节点集合更难。谢谢。

4

1 回答 1

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>&#xA;</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>&#xA;</xsl:text>可能不是必需的,但是您的示例<system.web>在不同的行中的输出中有打开和关闭,所以我添加了它以确保它们不会组合成一个短标签 ( <system.web />)。

于 2013-02-01T18:42:23.827 回答