这是我想要的输出:
<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中的文件更改未应用,如添加前缀,将keypath更改为no,如果我删除添加注册表的文件更改工作就像魅力!
我做错了什么?
感谢任何帮助,谢谢.
更新:这是没有转换的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文件中.当它被添加到其余的变换时,你会创建一个模糊的规则匹配情况,它应该引出一个警告,比如撒克逊会说的话:
[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>