Как использовать XSLT для фильтрации дубликатов из другого файла wxs - PullRequest
0 голосов
/ 17 мая 2018

Что у меня есть

У меня проблема с поиском дубликатов компонентов с использованием xslt. Я использую тепло, чтобы собрать 2 проекта. Эти проекты имеют несколько ссылок (DLL-файлы). Теперь тепло создает 2 фрагмента

  1. ConfiguratorFiles.wxs
  2. ServiceFiles.wxs

WiX Project Structure

ConfiguratorFiles.wxs создается первым и использует общий базовый фильтр:

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
  <xsl:template match="wix:Component[key('service-search', @Id)]"/>
  <xsl:template match="wix:ComponentRef[key('service-search', @Id)]" />

Вывод полностью в порядке, так как я действительно хочу, чтобы каждая dll копировалась и отфильтровывала файлы pdb.

Проблема возникает при создании файла ServiceFiles.wxs. Я просто не могу понять, как проверить, существует ли элемент в первом файле wxs.

Эта ссылка предоставила информацию, что я мог бы встроить функцию C #, чтобы выполнить некоторую логику. Мне кажется, это хитрый трюк, но я не знаю, как искать содержимое другого файла.

Текущий ServiceFilter.xslt

ServiceFilter.xslt почти такой же, как ConfiguratorFiles.xslt, но я также отфильтровываю файлы .exe, так как обрабатываю их вручную

  <!--Match and ignore .pdb files-->
  <xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
  <xsl:template match="wix:Component[key('service-search', @Id)]"/>
  <xsl:template match="wix:ComponentRef[key('service-search', @Id)]"/>

  <!--Match and ignore .exe files-->
  <xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, '.exe')]" use="@Id"/>
  <xsl:template match="wix:Component[key('exe-search', @Id)]"/>
  <xsl:template match="wix:ComponentRef[key('exe-search', @Id)]"/>

Пример:

У меня есть следующий компонент в обоих (ConfiguratorFiles.wxs и ServiceFiles.wxs). Это приводит к ошибке, поэтому мне нужно отфильтровать дубликаты.

 <Component Id="Foo.Base.dll" Guid="*">
     <File Id="Foo.Base.dll" KeyPath="yes" Source="$(var.Foo.DSI.Configurator.TargetDir)\Foo.Base.dll" />
 </Component>

Актуальный вопрос

Как написать фильтр "ServiceFilter.xslt", который фильтрует дубликаты, чтобы ServiceFiles.wxs не содержал файл, содержащийся в ConfiguratorFiles.wxs?

Обновление

Сейчас я пытаюсь использовать метод C #. Теперь мне нужно только выяснить, как получить все Компоненты в первом файле, чтобы заполнить метод FindDuplicate, так как он в настоящее время фильтрует все:)

  <!--Match and ignore duplicate components-->
  <xsl:key name="duplicate-search" match="wix:Component[user:FindDuplicate(wix:File/@Source)]" use="@Id"/>
  <xsl:template match="wix:Component[key('duplicate-search', @Id)]"/>
  <xsl:template match="wix:ComponentRef[key('duplicate-search', @Id)]"/>
  <msxsl:script language="C#" implements-prefix="user">
    <![CDATA[  
     public bool FindDuplicate(string name){  
       return true;
     }  
      ]]>
  </msxsl:script>

1 Ответ

0 голосов
/ 24 мая 2018

Решение было довольно простым.

Теперь я создаю 2 отдельных файла MSI.Тот, который устанавливает конфигуратор, а другой устанавливает Сервис.Эти 2 MSI-файла созданы в 2 разных проектах WiX, поэтому проблема с дублированными записями больше не будет появляться.

...