【发布时间】:2012-04-27 19:38:28
【问题描述】:
- 我需要删除所有
Component元素及其对应的ComponentRef元素,其中Component子元素File属性Source不是dll文件? - 我有
Source字符串值的评估函数,即{substring(wix:File/@Source, string-length(wix:File/@Source) - 2)}='dll'对包含dll的Source值返回true - 但是我不知道如何使用该函数删除最后两个
Component元素(及其子元素)以及对应的最后两个ComponentRef元素(由Id属性映射)?李>
源 XML
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETFOLDER">
<Component Id="cmpA733DB49D89AC9CEA2EDFAAEE51992E7" Guid="{F3412A8F-5718-45AB-9E6F-7B802BCC0EED}">
<File Source="$(var.WixSlave.TargetDir)\protobuf-net.dll" Id="fil910D6DB28382BAB5A9DF0ACBD5095ADE" KeyPath="yes" />
</Component>
<Component Id="cmpF1D751B9621E283AD7BDAA8BC6997338" Guid="{20C09DBB-C8D6-43CF-A9D6-C823850F86F6}">
<File Source="$(var.WixSlave.TargetDir)\client.wyc" Id="fil7454A527FA7C3918A537EB96235C9F5F" KeyPath="yes" />
</Component>
<Component Id="cmp8CDA926DD93F7CEFBF8FFF444D5828F4" Guid="{2243D9D8-C172-4FFE-AEBE-43659294E55D}">
<File Source="$(var.WixSlave.TargetDir)\protobuf-net.pdb" Id="fil3EA19C07C51C4E31D37065B3A8620713" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="Dlls">
<ComponentRef Id="cmpA733DB49D89AC9CEA2EDFAAEE51992E7" />
<ComponentRef Id="cmpF1D751B9621E283AD7BDAA8BC6997338" />
<ComponentRef Id="cmp8CDA926DD93F7CEFBF8FFF444D5828F4" />
</ComponentGroup>
</Fragment>
</Wix>
功能失调的 XSLT 存根
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="wix:File[{substring(wix:File/@Source, string-length(wix:File/@Source) - 2)}!='dll']"/>
</xsl:stylesheet>
这个 XSLT 在很多方面都不起作用,首先是第二个
match抱怨,我不确定这个表达式有什么问题..即使这样可行,您如何始终保留
DirectoryRef,同时删除不匹配的Component和子File元素?完全没有删除对应的
ComponentRef元素?
所需的 XML 输出
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETFOLDER">
<Component Id="cmpA733DB49D89AC9CEA2EDFAAEE51992E7" Guid="{F3412A8F-5718-45AB-9E6F-7B802BCC0EED}">
<File Source="$(var.WixSlave.TargetDir)\protobuf-net.dll" Id="fil910D6DB28382BAB5A9DF0ACBD5095ADE" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="Dlls">
<ComponentRef Id="cmpA733DB49D89AC9CEA2EDFAAEE51992E7" />
</ComponentGroup>
</Fragment>
</Wix>
【问题讨论】:
-
它抱怨是因为它不喜欢
{}。如果您从匹配中的 XPath 中删除了{},它将让它运行
标签: xml xslt xpath wix xslt-1.0