代码之家  ›  专栏  ›  技术社区  ›  daughey

wix xsl转换以有条件地删除组件

  •  1
  • daughey  · 技术社区  · 6 年前

    我可以很容易地让它抑制目录和组件元素,但事实证明ComponentRef元素很棘手。

    文件夹名为.PayloadData,这将成功抑制目录和组件元素:

      <xsl:template match="wix:Directory[@Name='.PayloadData']" />
      <xsl:template match="wix:Directory[@Name='.PayloadData']/*" /> 
    

    我为ComponentRef元素尝试了类似的方法,但它与所有内容都匹配。

    <xsl:template match="wix:ComponentRef[//wix:Directory[@Name='.PayloadData']/wix:Component[@Id=@Id]]">
    

    我认为@Id在xpath表达式中可能是不明确的,但我不知道如何告诉它ComponentRef的Id属性试图匹配组件的Id属性。

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <?include $(var.ProjectDir)\..\Common\Common.wxi?>
        <Fragment>
            <DirectoryRef Id="SampleDataDir">
                <Directory Id="dirFD22039A64AC1D31F568C1632B5AF8A3" Name=".PayloadData">
                    <Component Id="cmp846A29F6413B27E8777DD68E6026E461" Guid="*">
                        <File Id="fil9227EFCE377E7FEBB63A4BD121F278AE" KeyPath="yes" Source="$(var.SampleDataDir)\.PayloadData\SampleData.xml" />
                    </Component>
                </Directory>
                <Directory Id="dirA4E41FB410D214A14F0C8A302E5E70D2" Name="AlternativePBS">
                    <Component Id="cmp3E04EEF702FDD121FD225ABF32550EDB" Guid="*">
                        <File Id="filF1367714C6CE3472899C32E78D3D6D0C" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\01-ADMIN_Update_PBSHierarchy.xml" />
                    </Component>
                    <Component Id="cmp6732C6415C5574DB586333DE13FAFD1C" Guid="*">
                        <File Id="fil7F1A16AA0DA338664312C832796DD228" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\02-SCHEMA_Update_PBSHierarchy.xml" />
                    </Component>
                    <Component Id="cmp01BD73A317794376E5323FA329D1BFEB" Guid="*">
                        <File Id="filFD2213EB9E67560F25B506695650F7B0" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\ProcedureForAltPBSStructure.doc" />
                    </Component>
                    <Component Id="cmp1E93AAFF75E01670D20E84280E7B9B5C" Guid="*">
                        <File Id="filC02D64539D33E6B5250C883EFF6357DD" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\SPFAdapter_PBS.xml" />
                    </Component>
                    <Component Id="cmp428BA2587DEE28B22239181E175B108B" Guid="*">
                        <File Id="fil8D32FED82C161537AE2432BFA7F89310" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\UpdatePBSHierarchyGraphDef.xmlldr" />
                    </Component>
                </Directory>
            </DirectoryRef>
        </Fragment>
        <Fragment>
            <ComponentGroup Id="CG_SampleData">
                <ComponentRef Id="cmp846A29F6413B27E8777DD68E6026E461" />
                <ComponentRef Id="cmp3E04EEF702FDD121FD225ABF32550EDB" />
                <ComponentRef Id="cmp6732C6415C5574DB586333DE13FAFD1C" />
                <ComponentRef Id="cmp01BD73A317794376E5323FA329D1BFEB" />
                <ComponentRef Id="cmp1E93AAFF75E01670D20E84280E7B9B5C" />
                <ComponentRef Id="cmp428BA2587DEE28B22239181E175B108B" />
            </ComponentGroup>
        </Fragment>
    </Wix>
    

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <?include $(var.ProjectDir)\..\Common\Common.wxi?>
        <Fragment>
            <DirectoryRef Id="SampleDataDir">
                <Directory Id="dirA4E41FB410D214A14F0C8A302E5E70D2" Name="AlternativePBS">
                    <Component Id="cmp3E04EEF702FDD121FD225ABF32550EDB" Guid="*">
                        <File Id="filF1367714C6CE3472899C32E78D3D6D0C" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\01-ADMIN_Update_PBSHierarchy.xml" />
                    </Component>
                    <Component Id="cmp6732C6415C5574DB586333DE13FAFD1C" Guid="*">
                        <File Id="fil7F1A16AA0DA338664312C832796DD228" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\02-SCHEMA_Update_PBSHierarchy.xml" />
                    </Component>
                    <Component Id="cmp01BD73A317794376E5323FA329D1BFEB" Guid="*">
                        <File Id="filFD2213EB9E67560F25B506695650F7B0" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\ProcedureForAltPBSStructure.doc" />
                    </Component>
                    <Component Id="cmp1E93AAFF75E01670D20E84280E7B9B5C" Guid="*">
                        <File Id="filC02D64539D33E6B5250C883EFF6357DD" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\SPFAdapter_PBS.xml" />
                    </Component>
                    <Component Id="cmp428BA2587DEE28B22239181E175B108B" Guid="*">
                        <File Id="fil8D32FED82C161537AE2432BFA7F89310" KeyPath="yes" Source="$(var.SampleDataDir)\AlternativePBS\UpdatePBSHierarchyGraphDef.xmlldr" />
                    </Component>
                </Directory>
            </DirectoryRef>
        </Fragment>
        <Fragment>
            <ComponentGroup Id="CG_SampleData">
                <ComponentRef Id="cmp3E04EEF702FDD121FD225ABF32550EDB" />
                <ComponentRef Id="cmp6732C6415C5574DB586333DE13FAFD1C" />
                <ComponentRef Id="cmp01BD73A317794376E5323FA329D1BFEB" />
                <ComponentRef Id="cmp1E93AAFF75E01670D20E84280E7B9B5C" />
                <ComponentRef Id="cmp428BA2587DEE28B22239181E175B108B" />
            </ComponentGroup>
        </Fragment>
    </Wix>
    

    它需要剔除:

    • 目录dirFD22039A64AC1D31F568C1632B5AF8A3
    • 部件cmp846A29F6413B27E8777DD68E6026E461
    • 部件参考cmp846A29F6413B27E8777DD68E6026E461
    1 回复  |  直到 6 年前
        1
  •  1
  •   daughey    6 年前

    谢谢你的帮助。我现在有了答案。钥匙就是钥匙(双关语):

      <xsl:key name="ComponentsToSuppress" match="wix:Component[ancestor::wix:Directory[@Name='.PayloadData']]" use="@Id" />
      <xsl:template match="wix:Directory[@Name='.PayloadData']" />
      <xsl:template match="wix:ComponentRef[key('ComponentsToSuppress', @Id)]" />
    

    这允许我抑制名为“.PayloadData”的目录下出现的项目的Component和ComponentRef,而不管它出现在哪里(或出现的频率)。