2013-03-09 12 views
5

xml dönüşümleri uygulayarak heat.exe tarafından oluşturulan wxs dosyasını temizlemeye çalışıyorum.xslt tranfsormasyonu uygulayarak wxs dosyasından istenmeyen düğümleri kaldırma

Aşağıda, heat.exe'nin örnek bir dosya çıktısı verilmiştir.

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

Çocuğun Dosya düğümü, 'ABC' dizesini içeren bir Kaynak özelliğine sahip olan Bileşen düğümlerini kaldırmak istiyorum. Doğru eşleme desenlerini kullanarak bu düğümleri nasıl bulacağımı biliyorum. Bileşen düğümünü kaldırmadan önce, bileşenin kimliğini saklamak ve sonra ComponentRef düğümünü yeni kaydettiğim kimlikle kaldırmak için kullanmak istiyorum.

XML dönüşümü ile bunu elde etmenin bir yolu var mı? Silmekte olduğum Bileşen düğümünün kimliğini saklamak için bir 'X' değişkeni oluşturabildiğim bir şey arıyorum ve silinecek ComponentRef düğümlerini bulmak için 'X' kullanın.

cevap

11

Bunu değişkensiz yapabilirsiniz. Şunun gibi: senin numune girişi

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

çalıştırdığınızda, bu üretir:

<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

Bu seferki işe yaradı. Harika @JLRishe. – vaibinewbee

+0

Bu sadece harika, hemen çalışıyor. teşekkürler – sttaq

+1

Birden fazla öğeyi kaldırmak istiyorsanız, eşleşme özelliğine daha fazla koşul ekleyin: '' – HenningJ