2013-03-09 16 views
5

Próbuję oczyścić plik wxs wygenerowany przez heat.exe, stosując transformacje xml.Usuwanie niechcianych węzłów z pliku wxs przez zastosowanie transkryptu xslt

Poniżej znajduje się przykładowy plik wyjściowy pliku 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> 

Chcę usunąć węzły komponentów, których podrzędny węzeł pliku ma atrybut źródłowy zawierający ciąg "ABC". Wiem, jak znaleźć takie węzły przy użyciu prawidłowych wzorców dopasowania. Więc zanim usunę węzeł komponentu, chcę zapisać identyfikator komponentu, a następnie użyć go do usunięcia węzła ComponentRef z identyfikatorem, który właśnie nagrałem.

Czy jest sposób, w jaki mogę to osiągnąć dzięki transformacji XML? Myślę, że szukam czegoś, w którym mogę utworzyć zmienną, powiedzmy "X", aby przechowywać węzeł identyfikatora składnika, który usunę, i użyj "X", aby znaleźć węzły ComponentRef do usunięcia.

Odpowiedz

11

Możesz to zrobić bez zmiennych. Tak:

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

Podczas uruchomienia na wejściu próbki, to produkuje:

<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

Ten pracował jak urok. Niesamowite @JLRishe. – vaibinewbee

+0

To jest po prostu niesamowite, działa od razu. dzięki – sttaq

+1

Jeśli chcesz usunąć więcej niż jeden element, po prostu dodaj więcej warunków do atrybutu dopasowania: '' – HenningJ