我需要使用xslt修改web.config。我们无法直接访问实际的web.config转换前或后转换。修改它的唯一机制是使用xslt。
我编写了一个xslt,可以成功添加其他节点。如果它们存在,我可以添加子节点,或创建父节点,必要时填充子节点。
问题在于<configSections>
它需要是<configuration>
下的第一个节点,否则IIS会抱怨。如果保证存在,这不会是一个问题,但事实并非如此。无论我尝试过什么,我都无法强制结果可靠地将<configSections>
节点作为第一个节点。
在下面的示例中,如果<configSections>
不存在,则会将新<configSections>
置于顶部,但如果确实存在,则会将其添加到{{{1}内1}}标签)。
我到处搜索,但找不到这个看似简单的问题的解决方案,所以我希望有些XSLT专家会告诉我它真的很简单。应该注意我在xslt(!)
是一个完整的假人<configuration>
<configuration>
<appSettings>
...
</appSettings>
<otherStuff/>
</configuration>
答案 0 :(得分:1)
如果确实存在,我不确定在任意位置添加configSections
是什么意思。您将XSLT放在输出中的相同位置,但system.web
不存在的情况除外,因为您的XSLT会在任何现有system.web
之前放置configSections
。 }
无论如何,试试这个XSLT。这应首先选择任何现有的configSections
,如果它不存在则添加一个<xsl:template match="configuration">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="configSections"/>
<xsl:if test="not(configSections)">
<configSections>
<section name="mySection"/>
</configSections>
</xsl:if>
<xsl:if test="not(system.web)">
<system.web>
<httpRuntime executionTimeout="180" maxRequestLength="65536"/>
</system.web>
</xsl:if>
<xsl:apply-templates select="node()[not(self::configSections)]"/>
</xsl:copy>
</xsl:template>
。然后在最后,它可以选择所有其他元素。
{{1}}