当前位置: 首页 > 知识库问答 >
问题:

使用Heat工具获取Wix后,无法修改Directoryref/Directory元素的名称属性值

江俊能
2023-03-14

WiX工具集Heat工具从源目录中获取组件后,会生成一个wxs文件,其中包含以下内容。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="dirGeneratedID1" Name="MySourceDirName">
                <Component Id="cmpGeneratedID1" Guid="*">
                    <File Id="filGeneratedID1" KeyPath="yes" Source="$(var.SourceRootDir)\File1.dll" />
                </Component>
                <Component Id="cmpGeneratedID2" Guid="*">
                    <File Id="filGeneratedID2" KeyPath="yes" Source="$(var.SourceRootDir)\File2.dll" />
                </Component>
                <Directory Id="dirGeneratedID2" Name="MyNestedDirName">
                    <Component Id="cmpGeneratedID3" Guid="*">
                        <File Id="filGeneratedID3" KeyPath="yes" Source="$(var.SourceRootDir)\MyNestedDirName\File3.dll" />
                    </Component>
                </Directory>
            </Directory>
        </DirectoryRef>
    </Fragment>
</Wix>

我的任务是仅更改父目录元素的名称属性值。也就是说,将 /Wix/Fragment/DirectoryRef/Directory[@Name='MySourceDirName']元素的名称属性值从'MySourceDirName'更改为'MY_RENAMED_SOURCE_DIR_NAME',因此我得到以下结果。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="dirGeneratedID1" Name="MY_RENAMED_SOURCE_DIR_NAME">
                <Component Id="cmpGeneratedID1" Guid="*">
                    <File Id="filGeneratedID1" KeyPath="yes" Source="$(var.SourceRootDir)\File1.dll" />
                </Component>
                <Component Id="cmpGeneratedID2" Guid="*">
                    <File Id="filGeneratedID2" KeyPath="yes" Source="$(var.SourceRootDir)\File2.dll" />
                </Component>
                <Directory Id="dirGeneratedID2" Name="MyNestedDirName">
                    <Component Id="cmpGeneratedID3" Guid="*">
                        <File Id="filGeneratedID3" KeyPath="yes" Source="$(var.SourceRootDir)\MyNestedDirName\File3.dll" />
                    </Component>
                </Directory>
            </Directory>
        </DirectoryRef>
    </Fragment>
</Wix>

由于生成wxs文件的是Heat工具,源目录名为“MySourceDirName”,因此生成的目录元素名称属性等于“MySourceDirName”,稍后需要将其XSL转换为所需的新文件夹名“my\u RENAMED\u source\u DIR\u name”。

我使用了下面的XSLT,但它不起作用,我得到一个错误“DirectoryRef元素包含一个意外的属性'Name'

<?xml version="1.0" encoding="utf-8"?>

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

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

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

    <xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">

      <xsl:attribute name="Name">
        <xsl:choose>
          <xsl:when test=". = 'MySourceDirName'">
            <xsl:text>MY_RENAMED_SOURCE_DIR_NAME</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="." />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>

    </xsl:template>
</xsl:stylesheet

XSLT后生成的wxs文件成为错误且不完整的文件:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="SciemetricDIR" Name="" />
    </Fragment>
</Wix>

如果我更改我的XSLT并添加xsl:复制以恢复内容如下(这里我只显示整个XSLT内容的影响规则)

    <xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">

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

      <xsl:attribute name="Name">
        <xsl:choose>
          <xsl:when test=". = 'MySourceDirName'">
            <xsl:text>MY_RENAMED_SOURCE_DIR_NAME</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="." />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>

    </xsl:template>

然后我得到这个错误:“将转换C:\path-to-my-transform-file\MassageAfterHeatHarvesting.xsl到收获的WiX时出错:在添加文本、注释、pi或子元素节点后,无法将属性和命名空间节点添加到父元素。MySoulutionNameheat.exe0”

我的XSLT有什么问题?如果我清楚地将目录子元素定位在它下面,为什么它会触及DirectoryRef父元素?非常感谢您的支持。提前谢谢。

共有1个答案

丁长卿
2023-03-14

XSLT处理器遇到Directory元素,然后根据指定创建名称属性,而不创建其他内容(它停止)。

尝试更改

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory/@Name">

事实上,将条件作为谓词移动到匹配属性会更好:

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory/@Name[.='MySourceDirName']">
  <xsl:attribute name="Name">MY_RENAMED_SOURCE_DIR_NAME</xsl:attribute>
</xsl:template>
 类似资料:
  • 无法获取元素的“width”属性: null null 这将返回“undefined”,其他属性如“id”我可以通过这种方式获得,但不能获得width和height。我觉得这个问题太傻了,为什么不行?即使在这里,他们也应该可以工作:https://www.w3schools.com/jsref/prop_object_width.asp 我不需要任何类似jQuery或outerWidth等的变通方

  • 问题内容: 我正在使用Java解析Xml,我想在属性值的帮助下解析元素。 例如 在这种情况下,我想使用att值解析tag1数据。我是java和xml的新手。请引导我。 问题答案: 有多种方法可以做到这一点。您可以使用xPath(示例),DOM Document或SAX Parser(示例)来检索属性值和标记元素。 这是您要求的解决方法。我从不建议使用“ hack”类型,而是使用SAX(请参见示例链

  • 本文向大家介绍jQuery修改CSS伪元素属性的方法,包括了jQuery修改CSS伪元素属性的方法的使用技巧和注意事项,需要的朋友参考一下 CSS伪元素(pseudo elements)不是DOM元素,因此你无法直接选择到它们。 假设有如下HTML代码: 和CSS代码: 现在你想在某个元素的click事件中动态的把techbrood:before的width属性设置为100%, 有两个方法,一个是

  • 我想使用属性名称获取WooCommerce产品属性的ID。例如 我知道产品属性是分类法,但是get_taxonomy()不会返回分类法ID。我找不到一个可以这样做的Woocommerce函数。

  • 问题内容: 考虑以下功能: 而这个HTML部分: 显示警报框,但显示“未定义”。 问题答案: 您看到该错误的原因是因为返回了一个元素。并且a 元素没有属性。 使用此代替:

  • 我试图创建一个应用程序,在这个应用程序中,我可以在特定的用户帐户中获取/设置数据,我被Firebase所吸引。 我遇到的问题是,当我的结构如下所示时,我不知道如何针对特定的用户数据: 我环顾四周,找不到任何关于如何访问单个数据的信息,更别提当它们的ID是随机散列的时候了。 我该如何根据用户的名字来获取用户的信息呢?如果有更好的方法,请告诉我!