Копирование шаблона XSL и добавление элементов

#xml #xslt #xslt-1.0

#xml #xslt #xslt-1.0

Вопрос:

 <ComponentGroup Id="SimulatorComponentGroup">
   <Component Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" Directory="Simulator" Guid="*">
       <File Id="fil763F3807501181AEBB3384E197DA1B60" KeyPath="yes" Source="$(var.SimulatorSourcePath)aeStatGridWeights.txt" />
   </Component>
   <Component Id="cmp9FA0A11B61A218ED2C433E82749C7264" Directory="Simulator" Guid="*">
       <File Id="fil52CCB4416F79DAB20B21723321A693FD" KeyPath="yes" Source="$(var.SimulatorSourcePath)afStatGridWeights.txt" />
   </Component>
   <Component Id="cmp8EFEB6EE1903B8CF488FED2D3754A8CF" Directory="Simulator" Guid="*">
       <File Id="fil035410628EFD654283E0E6A32D1985C4" KeyPath="yes" Source="$(var.SimulatorSourcePath)anr_black_ag1_dl65_p80_sc1.ate_config" />
   </Component>
  

Я хотел бы создать шаблон, который выводит следующее:

 <ComponentGroup Id="SimulatorComponentGroup">
    <Component Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" Directory="Simulator" Guid="*">
        <File Id="fil763F3807501181AEBB3384E197DA1B60" KeyPath="yes" Source="$(var.SimulatorSourcePath)aeStatGridWeights.txt" />
        <RemoveFolder Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />
    </Component>
    <Component Id="cmp9FA0A11B61A218ED2C433E82749C7264" Directory="Simulator" Guid="*">
        <RemoveFolder Id="cmp9FA0A11B61A218ED2C433E82749C7264" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />
        <File Id="fil52CCB4416F79DAB20B21723321A693FD" KeyPath="yes" Source="$(var.SimulatorSourcePath)afStatGridWeights.txt" />
    </Component>
    <Component Id="cmp8EFEB6EE1903B8CF488FED2D3754A8CF" Directory="Simulator" Guid="*">
        <RemoveFolder Id="cmp8EFEB6EE1903B8CF488FED2D3754A8CF" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />
        <File Id="fil035410628EFD654283E0E6A32D1985C4" KeyPath="yes" Source="$(var.SimulatorSourcePath)anr_black_ag1_dl65_p80_sc1.ate_config" />
    </Component>
  

Вот мой файл *.xsl:

  <?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">


  <xsl:output omit-xml-declaration="yes" indent="yes" encoding="utf-8"/>
  <xsl:strip-space  elements="*"/>


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

  <xsl:output method="xml" indent="yes" />


 <xsl:template match="wix:Component[@Directory='Simulator']">
    <xsl:copy>
      <xsl:attribute name="Id">
        <xsl:value-of select="./Id"/>
      </xsl:attribute>
      <xsl:apply-templates/>
      <RemoveFolder Id=""></RemoveFolder>
      <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />      
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
  

когда я использую copy, я удаляю идентификатор и каталог из атрибута компонента, а также как я могу скопировать из Compnent Id=" идентификатора в attribute

Ответ №1:

Я не думаю, что ваш вопрос достаточно ясен, но, возможно, это поможет вам встать на правильный путь:

 <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Component">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <RemoveFolder Id="{@Id}" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
  

Отметьте в шаблоне соответствие «Компоненту»:

  1. применение шаблонов для копирования существующих атрибутов и дочерних узлов;
  2. использование шаблона значения атрибута для получения значения из Component/@Id в RemoveFolder/@Id.

Редактировать:

Чтобы разместить <File> (или любой существующий дочерний узел) после <RemoveFolder> и <RegistryValue> , измените второй шаблон на:

 <xsl:template match="Component">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <RemoveFolder Id="{@Id}" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" KeyPath="yes" />
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>
  

Комментарии:

1. есть ли способ изменить порядок атрибутов. то есть атрибут <File> будет отображаться последним, а не первым?

2. @Gilad <File> — это элемент , а не атрибут . Почему важен порядок? Это не должно иметь никакого значения.

3. я использую WIX, который является установщиком Windows, и порядок там имеет значение. поздравляю с 9 тысячами баллов