xml – 使用XSLT转换Heat生成的.wxs(添加RegistryValue并编辑一
发布时间:2020-12-16 23:16:20 所属栏目:百科 来源:网络整理
导读:这是我想要的输出: Component Id="C_SOMEFILE" Guid="some-guid-here" File Id="File_SOMEFILE" Source="$(var.Source)SOMEFILE" KeyPath="no" / RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="y
这是我想要的输出:
<Component Id="C_SOMEFILE" Guid="some-guid-here"> <File Id="File_SOMEFILE" Source="$(var.Source)SOMEFILE" KeyPath="no" /> <RegistryValue Root="HKCU" Key="SoftwareProduct" 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="SoftwareProduct" 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="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes" /> </Component> 一旦我激活 <xsl:template match="wix:Component/wix:File"> <xsl:copy-of select="." /> <RegistryValue Root="HKCU" Key="SoftwareProduct" 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> 解决方法
你说:
<xsl:template match="wix:Component/wix:File"> <xsl:copy-of select="." /> <RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes" /> </xsl:template>
通过“激活”,我认为你的意思是将它添加到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="SoftwareProduct" 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="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes"/> </Component> </Directory> </DirectoryRef> </Fragment> </Wix> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |