删除XSL中不匹配的父元素

时间:2012-04-27 19:38:29

标签: xml xslt xpath wix xslt-1.0

  • 我需要删除所有Component元素及其相应的ComponentRef元素,其中Component子元素File属性Source不是{{1}文件?
  • 我有dll字符串值的评估函数,即Source对包含{substring(wix:File/@Source, string-length(wix:File/@Source) - 2)}='dll'
  • Source值返回true
  • 但我不知道如何使用该函数删除最后两个dll元素(及其子元素)以及相应的最后两个Component元素(由{{1}映射}属性)?

源XML

ComponentRef

功能失调的XSLT Stub

Id
  • 这个XSLT在很多方面都不起作用,首先是第二个<?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> 抱怨,我不确定该表达式有什么问题..

  • 即使这样有效,在删除不匹配的<?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> 和子match元素时,如何保留DirectoryRef

  • 完全没有删除相应的Component元素?

所需的XML输出

File

1 个答案:

答案 0 :(得分:2)

以下是我的意思:

<?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:key name="component-id" match="//wix:Component[substring(wix:File/@Source, string-length(wix:File/@Source) - 2) != 'dll']" use="@Id"/>

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

    <xsl:template match="wix:Component[@Id = key('component-id', @Id)/@Id]"/>

    <xsl:template match="wix:ComponentRef[@Id = key('component-id', @Id)/@Id]"/>
</xsl:stylesheet>

这个想法很简单。告诉XSLT处理器构建我们想要删除的那些Component节点的索引,然后使用匹配的模板来抑制xsl:copy