Установщик WiX: Используя xslt с heat.exe, как найти подходящую подстроку при использовании атрибута соответствия? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующий источник:

    <DirectoryRef Id="INSTALLDIR">
        <Component Id="Groupacuthin.exeAutoUpdate_acuthin.exe" Guid="*" Win64="no">
            <File Id="Groupacuthin.exeAutoUpdate_acuthin.exe" KeyPath="yes" Source="$(var.HARVESTDIR)\Groupacuthin.exeAutoUpdate\acuthin.exe" />
        </Component>
    </DirectoryRef>

У меня есть следующий шаблон, который находит все DirectoryRef с Id «INSTALLDIR» и компонентом с Id Groupacuthin.exeAutoUpdate_acuthin.exe 'и изменяет DirectoryRef Id с' INSTALLDIR 'на' TARGETDIR ':

  <xsl:template match="wix:DirectoryRef[@Id='INSTALLDIR' and wix:Component/@Id='Groupacuthin.exeAutoUpdate_acuthin.exe']">
    <xsl:copy>
      <xsl:attribute name="Id">TARGETDIR</xsl:attribute>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

Вот правильный результат:

    <DirectoryRef Id="TARGETDIR">
        <Component Id="Groupacuthin.exeAutoUpdate_acuthin.exe" Guid="*" Win64="no">
            <File Id="Groupacuthin.exeAutoUpdate_acuthin.exe" KeyPath="yes" Source="$(var.HARVESTDIR)\Groupacuthin.exeAutoUpdate\acuthin.exe" />
        </Component>
    </DirectoryRef>

Если у моего источника есть несколько DirectoryRefs с Component Id, которые выглядят например:

<Component Id="Groupacuthin.exeAutoUpdate_acuthin.exe" Guid="*" Win64="no">
<Component Id="Groupfile1.exeAutoUpdate_file1.exe" Guid="*" Win64="no">
<Component Id="Groupfile2.exeAutoUpdate_file2.exe" Guid="*" Win64="no">

Есть ли способ изменить шаблон, чтобы он соответствовал любому Компоненту, у которого есть Id, где Id содержит подстроку 'AutoUpdate'?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете использовать функцию contains в правиле сопоставления шаблонов:

<xsl:template match="wix:DirectoryRef[@Id='INSTALLDIR' and contains(wix:Component/@Id,'AutoUpdate')]">
  ...
</xsl:template>

Тогда все ваши образцы будут совпадать.


Есть ли способ изменить шаблон, чтобы он соответствовал любому компоненту с идентификатором, в котором идентификатор содержит подстроку 'AutoUpdate'?

. Для этого используйте следующий шаблон:

<xsl:template match="wix:Component[contains(@Id,'AutoUpdate')]">
  <xsl:element name="Component">
    <xsl:copy-of select="@*"/>
  </xsl:element>
</xsl:template>

Без шаблон идентификации , результат будет

<?xml version="1.0"?>
<Component Id="Groupacuthin.exeAutoUpdate_acuthin.exe" Guid="*" Win64="no"/>
<Component Id="Groupacuthin.exeAutoUpdate_acuthin.exe" Guid="*" Win64="no"/>
<Component Id="Groupfile1.exeAutoUpdate_file1.exe" Guid="*" Win64="no"/>
<Component Id="Groupfile2.exeAutoUpdate_file2.exe" Guid="*" Win64="no"/>
...