wix heat 使用 xsl 文件移除命名空间

Posted

技术标签:

【中文标题】wix heat 使用 xsl 文件移除命名空间【英文标题】:wix heat remove namespace using xsl file 【发布时间】:2014-07-06 20:56:10 【问题描述】:

这是我的预构建脚本:

"%WIX%\bin\heat.exe" dir "$(SolutionDir)Export\Release\SkyCam\Config" -t   "$(SolutionDir)IQStudioInstaller\SimulatorIgnore.xsl" -dr Simulator -srd -cg SimulatorComponentGroup -var var.SimulatorSourcePath -ag -sreg -out "$(SolutionDir)IQStudioInstaller\IQStudiosimulatorDir.wxs"

这是我的 *.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="*"/>
  <!-- identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wix: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>
</xsl:stylesheet>

我遇到的问题是添加了 xlmns 属性,该属性被添加到我的和中:

xmlns="" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"

为什么要添加它以及如何删除它?

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="Simulator" />
    </Fragment>
    <Fragment>
        <ComponentGroup Id="SimulatorComponentGroup">
            <Component Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" Directory="Simulator" Guid="*">
                <RemoveFolder Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" On="uninstall" **xmlns="" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"** />
                <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" xmlns="" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <File Id="fil763F3807501181AEBB3384E197DA1B60" KeyPath="yes" Source="$(var.SimulatorSourcePath)\aeStatGridWeights.txt" />
            </Component>
            <Component Id="cmp9FA0A11B61A218ED2C433E82749C7264" Directory="Simulator" Guid="*">
                <RemoveFolder Id="cmp9FA0A11B61A218ED2C433E82749C7264" On="uninstall" **xmlns="" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"** />
                <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" xmlns="" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <File Id="fil52CCB4416F79DAB20B21723321A693FD" KeyPath="yes" Source="$(var.SimulatorSourcePath)\afStatGridWeights.txt" />
            </Component>

更新:

我按照 Tim 的建议编辑了我的 *.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"
    xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <xsl:output omit-xml-declaration="yes" indent="yes" encoding="utf-8"/>
  <xsl:strip-space  elements="*"/>
  <!-- identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wix: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>
</xsl:stylesheet>

现在的输出是:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="Simulator" />
    </Fragment>
    <Fragment>
        <ComponentGroup Id="SimulatorComponentGroup">
            <Component Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" Directory="Simulator" Guid="*">
                <wix:RemoveFolder Id="cmpCAB8CD4B3E3F5DE9BD27E4BE2C6D4ED5" On="uninstall" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <File Id="fil763F3807501181AEBB3384E197DA1B60" KeyPath="yes" Source="$(var.SimulatorSourcePath)\aeStatGridWeights.txt" />
            </Component>
            <Component Id="cmp9FA0A11B61A218ED2C433E82749C7264" Directory="Simulator" Guid="*">
                <wix:RemoveFolder Id="cmp9FA0A11B61A218ED2C433E82749C7264" On="uninstall" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" />
                <File Id="fil52CCB4416F79DAB20B21723321A693FD" KeyPath="yes" Source="$(var.SimulatorSourcePath)\afStatGridWeights.txt" />
            </Component>

所以xmlns="" 不见了! 但是它并没有解决xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"

【问题讨论】:

你的问题不清楚。您想从输出中完全删除 wix 命名空间,还是只删除多余(且无害)的前缀及其绑定? 【参考方案1】:

问题在于这些行

  <RemoveFolder Id="@Id" On="uninstall" />
  <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />

您在 NO 命名空间中输出元素,但对于您的 Wix 文件,它们需要进入“http://schemas.microsoft.com/wix/2006/wi”命名空间。

您可以通过为元素指定相关的命名空间前缀来轻松解决此问题

  <wix:RemoveFolder Id="@Id" On="uninstall" />
  <wix:RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />

或者,您也可以将 wix 命名空间作为默认命名空间添加到 XSLT

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

这样,没有命名空间前缀的元素实际上将成为默认命名空间的一部分。

【讨论】:

我不确定你能做些什么。虽然看起来很奇怪,但从语义上来说结果是正确的,Wix 应该可以愉快地解析它。

以上是关于wix heat 使用 xsl 文件移除命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Wix、Heat 和 Wxi 文件

如何让 Wix Heat.exe 保留自定义文件 ID?

Wix 资源收集工具“Heat”。如何获取具有动态名称的文件,例如构建时生成的 Microsoft 运行时文件

在 XSL 翻译中更改 XML 文件的命名空间

Wix Installer Heat.exe 错误 参数“exePath”无效

XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误