WiX XSLT转换弄乱了我的格式

时间:2016-02-05 01:22:31

标签: xml xslt wix transform heat

我正在尝试使用转换将属性添加到组件描述中。它正确地添加了属性但是弄乱了我的XML格式。

我的目标是将属性'Permanent =“yes”'添加到Component。

XSLT是:

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

    <xsl:template match="wix:Component">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:attribute name="Permanent">
                <xsl:text>yes</xsl:text>
            </xsl:attribute>
            <xsl:apply-templates select="*" />
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="@* | text()">
        <xsl:copy />
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

</xsl:stylesheet>

转换前的.wxl文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="SystemFolder">
            <Component Id="tdbgpp7.dll" Guid="{FA172CDA-D111-49BD-940F-F72EB8AC90DA}">
                <File Id="tdbgpp7.dll" KeyPath="yes" Source="$(var.OC2.WinSys32)\tdbgpp7.dll" />
            </Component>
        </DirectoryRef>
    </Fragment>
</Wix>

并且转换后看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="SystemFolder">
            <Component Id="tdbgpp7.dll" Guid="{415E5416-AFE3-4658-8D74-489554345219}" Permanent="yes"><File Id="tdbgpp7.dll" KeyPath="yes" Source="$(var.OC2.WinSys32)\tdbgpp7.dll" /></Component>
        </DirectoryRef>
    </Fragment>
</Wix>

正如您所看到的,它正在按预期添加我的属性,但它会丢失一些格式。代码仍然有效,但失去了可读性。我知道我必须错过一些简单的东西,但到目前为止,我已经没有了。我对这种转变的东西是个菜鸟。

1 个答案:

答案 0 :(得分:2)

这是因为在您的模板中匹配wix:Component,您执行了<xsl:apply-templates select="*" />。这意味着您只将模板应用于元素,因此wix:Component内的文本节点(无效的空格)将被剥离。

我建议使用identity transform并将模板应用于node()模板中的wix:Component ...

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

  <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="@*" />
      <xsl:attribute name="Permanent">
        <xsl:text>yes</xsl:text>
      </xsl:attribute>
      <xsl:apply-templates select="node()" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>