2013-03-09 57 views
5

我想通過應用xml轉換來清理heat.exe生成的wxs文件。通過應用xslt tranfsormation從wxs文件中刪除不需要的節點

以下是heat.exe的示例文件輸出。

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
      <DirectoryRef Id="APPFOLDER"> 
       <Component Id="cmp78E9FF58917B1844F3E9315A285F3147" Guid="SOME-GUID"> 
        <File Id="fil093D6D7CB723B5B62730D7B4E575F154" KeyPath="yes" Source="PQR.Some.dll" /> 
       </Component> 
       <Component Id="cmp0B084126FAE7577FD84DB29766AC6C2B" Guid="SOME-GUID"> 
        <File Id="filB20C8708D7EB02EDFBCC4D70F9FE7F8A" KeyPath="yes" Source="ABC.Another.dll" /> 
       </Component> 
       <Component Id="cmp83BB1954DECD7D949AAE4ACA68806EC3" Guid="SOME-GUID"> 
        <File Id="fil0E29FBFF7DB39F307A2EE19237A0A579" KeyPath="yes" Source="ABC.OneMore.dll" /> 
       </Component> 
      </DirectoryRef> 
     </Fragment> 
     <Fragment> 
      <ComponentGroup Id="AppFiles"> 
       <ComponentRef Id="cmp78E9FF58917B1844F3E9315A285F3147" /> 
       <ComponentRef Id="cmp0B084126FAE7577FD84DB29766AC6C2B" /> 
       <ComponentRef Id="cmp83BB1954DECD7D949AAE4ACA68806EC3" /> 
      </ComponentGroup> 
     </Fragment> 
    </Wix> 

我想刪除其子節點文件節點具有包含字符串「ABC」的源屬性的組件節點。我知道如何使用正確的匹配模式來找到這樣的節點。 因此,在我刪除組件節點之前,我想存儲該組件的Id,然後使用它刪除帶有我剛記錄的Id的ComponentRef節點。

有沒有一種方法可以實現這種XML轉換?我想我正在尋找一些東西,我可以創建一個變量'X'來存儲我刪除的Component節點的Id,並使用'X'來查找要刪除的ComponentRef節點。

回答

11

您可以在沒有變量的情況下執行此操作。就像這樣:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:wi="http://schemas.microsoft.com/wix/2006/wi"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:key name="kCompsToRemove" 
      match="wi:Component[contains(wi:File/@Source, 'ABC')]" 
      use="@Id" /> 

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

    <xsl:template match="*[self::wi:Component or self::wi:ComponentRef] 
         [key('kCompsToRemove', @Id)]" /> 
</xsl:stylesheet> 

當你的樣品輸入運行,這將產生:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="APPFOLDER"> 
     <Component Id="cmp78E9FF58917B1844F3E9315A285F3147" Guid="SOME-GUID"> 
     <File Id="fil093D6D7CB723B5B62730D7B4E575F154" KeyPath="yes" Source="PQR.Some.dll" /> 
     </Component> 
    </DirectoryRef> 
    </Fragment> 
    <Fragment> 
    <ComponentGroup Id="AppFiles"> 
     <ComponentRef Id="cmp78E9FF58917B1844F3E9315A285F3147" /> 
    </ComponentGroup> 
    </Fragment> 
</Wix> 
+0

這一個工作就像魅力。真棒@JLRishe。 – vaibinewbee 2013-03-11 02:07:30

+0

這只是驚人的,馬上工作。謝謝 – sttaq 2013-04-04 16:18:08

+1

如果你想刪除多個元素,只需要在匹配屬性中添加更多條件: '''''''xsl:key name =「kCompsToRemove」match =「wi:Component [contains(wi:File/@ Source,'。 nupkg')或包含(wi:File/@ Source,'my-debug-file')]「use =」@ Id「/> – HenningJ 2016-07-11 11:40:29