Что у меня есть
У меня проблема с поиском дубликатов компонентов с использованием xslt.
Я использую тепло, чтобы собрать 2 проекта. Эти проекты имеют несколько ссылок (DLL-файлы). Теперь тепло создает 2 фрагмента
- ConfiguratorFiles.wxs
- ServiceFiles.wxs
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>