2016-03-23 47 views
0

我是XSLT中的一名初學者。我使用Wix toolsetheat.exe來生成有效載荷。如何操作XML文檔中的屬性

下面是實施例1生成的xml的:

<PayloadGroup Id="ALC_272_662_888"> 
    <Payload SourceFile="$(var.SourceDir4)\VISTA\WAVESGUILIB.DLL" Name="$(var.SourceDir4)\VISTA\WAVESGUILIB.DLL" /> 
    <Payload SourceFile="$(var.SourceDir4)\VISTA\WAVESLIB.DLL" Name="$(var.SourceDir4)\VISTA\WAVESLIB.DLL" /> 
</PayloadGroup> 

這是實施例2:

<PayloadGroup Id="CS_H81_Q87"> 
    <Payload SourceFile="$(var.SourceDir1)\CSVER.DLL" Name="$(var.SourceDir1)\CSVER.DLL" /> 
    <Payload SourceFile="$(var.SourceDir1)\DIFXAPI.DLL" Name="$(var.SourceDir1)\DIFXAPI.DLL" /> 
    <Payload SourceFile="$(var.SourceDir1)\HELP.TXT" Name="$(var.SourceDir1)\HELP.TXT" /> 
    <Payload SourceFile="$(var.SourceDir1)\IIF2.INI" Name="$(var.SourceDir1)\IIF2.INI" /> 
</PayloadGroup> 

我想創建一個變換,這將在屬性Name文本$(var.SourceDir1)$(var.SourceDir4)用空代替字符串取決於哪一個將出現。

我嘗試了多種事情 - 但xslt有它自己的邏輯。先謝謝你!

+1

向我們展示您嘗試過的一件東西總是最好的,但這並不奏效。這讓我們瞭解到你的學習曲線有多遠,並且有助於表明你在尋求幫助之前已經做出了努力。使用XSLT 1.0或2.0時,XSLT問題也很重要,因爲它們都是常用的,而且解決方案通常是非常不同的。 –

+0

我使用了此轉換的修改版本: http://stackoverflow.com/a/33834345/5587125 其中我使用var.SourceDir1而不是varSourceDir複製模板。 – sloter1024

回答

0

這會做的伎倆:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="@Name[contains(current(),'var.SourceDir4)') or contains(current(),'var.SourceDir1)')]"> 
    <xsl:attribute name="Name"> 
    <xsl:value-of select="substring-after(current(),')')"/>  
    </xsl:attribute> 
</xsl:template> 
</xsl:transform> 

第一個模板(匹配= 「@ * |節點()」)使得一切的精確副本。第二個模板覆蓋任何名稱爲「Name」的屬性,該名稱包含'var.SourceDir4)'或'var.SourceDir1'',並將屬性值替換爲第一次關閉後的內容')'。

EDIT#1:增加了對澄清小提琴:http://xsltransform.net/bnnZX2

EDIT#2:它與 '電流()' 與發動機 '撒克遜9.5.1.6 HE'。使用「Saxon 9.5.1.6 EE」,「Saxon 6.5.5」或「Xalan 2.7.1」,您需要使用'。'。而不是'current()',以使其工作。

+0

謝謝你的回答 - 我會定義嘗試它。有什麼辦法可以修改這個轉換來完成這個技巧嗎? http://stackoverflow.com/a/33834345/5587125 – sloter1024

+0

我嘗試過了,我得到錯誤: 「當前()」函數不能在一個模式 – sloter1024

+0

奇怪的使用。這個對我有用。嘗試用''替換'current()'。 (上下文節點) –