gpt4 book ai didi

xml - 使用 XSLT 转换 Heat 生成的 .wxs(添加 RegistryValue 并编辑一些值)

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:25 25 4
gpt4 key购买 nike

这是我想要的输出:

<Component Id="C_SOMEFILE" Guid="some-guid-here">
<File Id="File_SOMEFILE" Source="$(var.Source)\SOMEFILE" KeyPath="no" />
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

这是我的 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"
exclude-result-prefixes="xsl wix">

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

<xsl:strip-space elements="*"/>

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

<!--Set KeyPath to NO-->
<xsl:template match='wix:File[@Id]'>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="KeyPath">
<xsl:text>no</xsl:text>
</xsl:attribute>
</xsl:copy>
</xsl:template>

<xsl:template match="wix:Component/wix:File">
<xsl:copy-of select="." />
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</xsl:template>

<!--Give Compoentent ID prefix C_-->
<xsl:template match="wix:Component/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('C_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give Componentref ID prefix C_-->
<xsl:template match="wix:ComponentRef/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('C_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give Directory ID prefix Dir_-->
<xsl:template match="wix:Directory/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('Dir_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give File ID prefix File_-->
<xsl:template match="wix:File/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('File_', .)" />
</xsl:attribute>
</xsl:template>

这是我使用该 XSL 的输出:

<Component Id="C_SOMEFILE" Guid="some-guid-here">
<File Id="SOMEFILE" KeyPath="yes" Source="$(var.Source)\SOMEFILE" />
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

一旦我激活

<xsl:template match="wix:Component/wix:File">
<xsl:copy-of select="." />
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</xsl:template>

XSL 中的文件更改不会应用,例如添加前缀、将 key 路径更改为否,如果我删除添加注册表的文件更改,文件更改就像一个魅力!

我做错了什么?

感谢任何帮助,谢谢。

更新:这是未经转换的原始 XML 示例:

    <?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="Dir_Exentsions">
<Directory Id="SOMEFILE" Name="SOMEFILE">
<Component Id="SOMEFILE" Guid="7D8FDF2D-CED9-4A08-A57E-96CD7FFA8E9A">
<File Id="SOMEFILE" KeyPath="yes" Source="$(var.Source)\SOMEFILE" />
</Component>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>

最佳答案

你说:

As soon as i activate

<xsl:template match="wix:Component/wix:File">
<xsl:copy-of select="." />
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</xsl:template>

The File changes that are in XSL are not applied like add a prefix, change keypath to no, if i remove the one that adds the registry the file changes work like a charm!

“激活”是指将其添加到 XSLT 文件。当它添加到其余转换时,您会创建一个不明确的规则匹配情况,它应该引发警告,例如 Saxon 会说的话:

 [xslt] : Error! Ambiguous rule match for /Wix/Fragment[1]/DirectoryRef[1]/Directory[1]/Component[1]/File[1]
[xslt] Matches both "wix:Component/wix:File" on line 28 of file:/c:/gd/usr/kjh/proj/try/xslt/try.xsl
[xslt] and "wix:File[@Id]" on line 19 of file:/c:/gd/usr/kjh/proj/try/xslt/try.xsl

这里有一个歧义的解决方法:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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"
exclude-result-prefixes="xsl wix">

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

<xsl:strip-space elements="*"/>

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

<xsl:template match="wix:Component/wix:File[@Id]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="KeyPath">
<xsl:text>no</xsl:text>
</xsl:attribute>
</xsl:copy>
<RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</xsl:template>

<xsl:template match="wix:Component/wix:File[not(@Id)]">
<!-- Placeholder for handling anything that should happen
different for wix:File without @Id attribute. -->
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>

<!--Give Compoentent ID prefix C_-->
<xsl:template match="wix:Component/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('C_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give Componentref ID prefix C_-->
<xsl:template match="wix:ComponentRef/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('C_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give Directory ID prefix Dir_-->
<xsl:template match="wix:Directory/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('Dir_', .)" />
</xsl:attribute>
</xsl:template>

<!--Give File ID prefix File_-->
<xsl:template match="wix:File/@Id">
<xsl:attribute name="{name()}">
<xsl:value-of select="concat('File_', .)" />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>

当在您的输入文件上运行时,它会产生所需的输出:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="Dir_Exentsions">
<Directory Id="Dir_SOMEFILE" Name="SOMEFILE">
<Component Id="C_SOMEFILE" Guid="7D8FDF2D-CED9-4A08-A57E-96CD7FFA8E9A">
<File Id="File_SOMEFILE" KeyPath="no" Source="$(var.Source)\SOMEFILE"/>
<RegistryValue Root="HKCU"
Key="Software\Product"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>

关于xml - 使用 XSLT 转换 Heat 生成的 .wxs(添加 RegistryValue 并编辑一些值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com