обновить стороннее преобразование .config из установщика - PullRequest
1 голос
/ 05 апреля 2011

У меня есть 2 файла .config, которые необходимо настроить. Один из них - web.config, а другой - app.config, оба эти файла принадлежат сторонним поставщикам, внутри которых работает наш код. Поэтому нам нужно внести в него коррективы, чтобы он видел наш код.

Мой план состоял в том, чтобы использовать xslt, чтобы взять наш файл .config и объединить его со сторонним.

Я видел несколько примеров того, как делать подобные вещи с помощью msbuild, но так как мы делаем это на месте, нам придется делать это с помощью установщика. Любая помощь будет оценена.

Пример: Мы начинаем с:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

Пользовательский раздел

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="productName" type="company.productName, company, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" />
  </configSections>
  <productName defaultProvider="Provider1">
    <providers>
      <clear />
      <add name="Provider1" type="Company.Product.Authentication.Provider1, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="localhost:5555" />
      <add name="Provider2" type="Company.Product.Authentication.Provider2, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="demo.example.com" />
    </providers>
  </productName>
</configuration>

И заканчивается на:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="productName" type="company.productName, company, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" />
  </configSections>
  <productName defaultProvider="Provider1">
    <providers>
      <clear />
      <add name="Provider1" type="Company.Product.Authentication.Provider1, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="localhost:5555" />
      <add name="Provider2" type="Company.Product.Authentication.Provider2, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="demo.example.com" />
    </providers>
  </productName>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

1 Ответ

1 голос
/ 06 апреля 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="document('test.xml')/*">
            <xsl:with-param name="pContext" select="*"/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="*[*]">
        <xsl:param name="pContext" select="/.."/>
        <xsl:variable name="vCurrent" select="."/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:copy-of select="$pContext/@*"/>
            <xsl:for-each select="*">
                <xsl:apply-templates select=".">
                    <xsl:with-param name="pContext"
                         select="$pContext/*[name()=name(current())]"/>
                </xsl:apply-templates>
            </xsl:for-each>
            <xsl:for-each select="$pContext/*">
                <xsl:apply-templates
                     select="(.)[not($vCurrent/*[name()=name(current())])]"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[not(*)]">
        <xsl:param name="pContext" select="/.."/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:copy-of select="$pContext/@*"/>
            <xsl:apply-templates
                 select="node()[not($pContext)]|$pContext/node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<configuration>
    <runtime>
        <gcServer enabled="true"/>
    </runtime>
</configuration>

И это test.xml:

<configuration>
    <configSections>
        <section name="productName" type="company.productName, company, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" />
    </configSections>
    <productName defaultProvider="Provider1">
        <providers>
            <clear />
            <add name="Provider1" type="Company.Product.Authentication.Provider1, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="localhost:5555" />
            <add name="Provider2" type="Company.Product.Authentication.Provider2, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="demo.example.com" />
        </providers>
    </productName>
</configuration>

Вывод:

<configuration>
    <configSections>
        <section name="productName" type="company.productName, company, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c"></section>
    </configSections>
    <productName defaultProvider="Provider1">
        <providers>
            <clear></clear>
            <add name="Provider1" type="Company.Product.Authentication.Provider1, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="localhost:5555"></add>
            <add name="Provider2" type="Company.Product.Authentication.Provider2, Company.Product, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9072a6c5128d57c" hostName="demo.example.com"></add>
        </providers>
    </productName>
    <runtime>
        <gcServer enabled="true"></gcServer>
    </runtime>
</configuration>

Примечание : три правила.Корневое правило документа: измените дерево обхода на источник, нуждающийся в обновлении, и сохраните источник ввода как $pContext.Элемент с правами дочерних элементов: скопируйте себя с атрибутами, обновите атрибуты атрибутами $pContext (это делает процессор, потому что создает правила атрибутов ), примените шаблоны к дочерним элементам с новыми $pContext (ребенок старого возраста $pContext с тем же именем), примените шаблоны к детям $pContext, имена которых не соответствуют ни одному из детей.Элемент без элементов дочернее правило: скопируйте себя с атрибутами, обновленными с атрибутами $pContext, если в $pContext есть узел, скопируйте его, тем самым заменив содержимое элемента (или даже раздел, если у вас есть пустой элемент в $pContext).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...