2013-03-09 17 views
5

Sto cercando di pulire il file wxs generato da heat.exe applicando le trasformazioni xml.Rimozione dei nodi indesiderati dal file wxs applicando xslt tranfsormation

Di seguito è riportato un esempio di output di 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> 

Desidero rimuovere i nodi Componente il cui nodo File figlio ha un attributo Source contenente la stringa "ABC". So come trovare questi nodi usando i corretti schemi di corrispondenza. Quindi, prima di rimuovere il nodo Componente, voglio memorizzare l'Id del componente e quindi usarlo per rimuovere il nodo ComponentRef con l'Id che ho appena registrato.

C'è un modo per ottenerlo con la trasformazione XML? Penso che sto cercando qualcosa in cui posso creare una variabile dire 'X' per memorizzare il nodo Id of Component che elimino, e usare 'X' per trovare i nodi ComponentRef da eliminare.

risposta

11

È possibile farlo senza variabili. Come questo:

<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> 

Quando viene eseguito sul vostro input di esempio, questo produce:

<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

Questo ha funzionato come fascino. Fantastico @JLRishe. – vaibinewbee

+0

questo è semplicemente fantastico, funziona subito. grazie – sttaq

+1

Se vuoi rimuovere più di un elemento, aggiungi solo più condizioni all'attributo di corrispondenza: '' – HenningJ