如何插入 app.config 部分或更改它(如果它已经存在)

How to insert an app.config section or change it if it is already there

我有以下简化的 app.config .NET 4.7 应用程序文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
   </startup>
   <runtime>
   </runtime>
</configuration>

现在,如果该部分尚不存在,我需要将名为 Dependencies 的新部分(元素)插入其中。该部分需要有一个名为 MyDependencies 的子元素,它可以包含多个 CustomDependency 元素。这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
   </startup>
   <Dependencies>
      <MyDependencies>
         <CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>
      </MyDependencies>
   </Dependencies>
   <runtime>
   </runtime>
</configuration>

但是,如果具有特定名称的 CustomDependency 元素已经存在,则只需要更改该元素(IdAnotherAttribute)的属性值。这应该通过使用提交给 XSLT 文件的参数来完成。

因此,输入可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
   </startup>
   <Dependencies>
      <MyDependencies>
        <CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>
        <CustomDependency Name="UniqueName2" Id="87654321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
      </MyDependencies>
      <YourDependencies>
        <CustomDependency Name="UniqueName2" Id="ABC54321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
      </YourDependencies>
   </Dependencies>
   <runtime>
   </runtime>
</configuration>

在这种情况下,名称为 UniqueName 的元素的属性值,例如

<CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>

必须更新到

<CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>

要实现这一点,XSLT 代码应该是什么样子?

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />
  
  <xsl:template match="@*|node()" name="copy-all">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@Id">
    <xsl:attribute name="Id">CustomValue</xsl:attribute>
  </xsl:template>

  <xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@AnotherAttribute">
    <xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>
  </xsl:template>

  <xsl:template match="startup[not(../Dependencies)]">
    <xsl:call-template name="copy-all" />
    <xsl:element name="Dependencies">
      <xsl:element name="MyDependencies">
        <xsl:element name="CustomDependency">
          <xsl:attribute name="Name">UniqueName</xsl:attribute>
          <xsl:attribute name="Id">12345678-1234-1234-1234-123456781234</xsl:attribute>
          <xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>  
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>