我有一個由WiX的熱工具生成的WXS文件。我試圖用一個(現有的)文件修改它,以便根據另一個XML文件的內容自動排除某些組件(我將稱之爲parts.xml)。 xslt文件目前用於從安裝程序中刪除一些組件/文件/目錄,但是用於相對靜態的列表。如何通過命令行將絕對路徑傳遞給XSLT 1.0中的參數(使用msxsl.exe)?
但是,就目前而言,我主要關心的是如何從參數中加載和存儲正確的路徑,並將其內容存儲在變量中。
這是如何被應用的變換(WiX的一次完成熱收穫到一個文件「before.wxs」):我在srcroot通過
msxsl.exe "before.wxs" "exclusions.xslt" -o "after.wxs" srcroot="$(SrcRoot)"
是XSLT文件,將內部的參數用於在用戶的機器上找到parts.xml。
您可以通過命令行參數,並更換所有回正斜槓斜槓:
<!-- Adapted from http://stackoverflow.com/a/30153713/5605122 and http://geekswithblogs.net/Erik/archive/2008/04/01/120915.aspx-->
<xsl:param name="srcroot" />
<xsl:variable name="filename">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="concat('file://', $srcroot, '/foo/parts.xml')" />
<xsl:with-param name="replace" select='\\' />
<xsl:with-param name="by" select='/' />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="myparts" select="document($filename)" />
的字符串替換,所有我從here得到的是:
<!-- XSL 1.0 string-replace-all, taken from: http://geekswithblogs.net/Erik/archive/2008/04/01/120915.aspx -->
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text"
select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我得到一個相當無益的錯誤:
Code: 0x80004005 Unexpected character in query string.
但如果我刪除我發佈的代碼片段,錯誤消失。我不知道如何調試,並弄清楚發生了什麼,但通過它後,我認爲我對我認爲應該發生的事情有一個基本的誤解,而不僅僅是一個錯字或語法錯誤。
最終,我想將parts.xml的內容存儲在「myparts」中。我在這裏錯過了什麼?
謝謝!
你有一個參數'$ src'和另外一個'$ srcroot',如果代碼片段完整的話會給出一個錯誤。 –
哎呀,這實際上是一個錯字,將它複製到這裏(我將其重命名爲使它更清楚它的目的是什麼)。我已經修復了這個問題。實際的文件沒有這個錯字,但我已經把它們全部更改爲「srcroot」。謝謝。事實證明,我也錯過了使用從[這裏](http://geekswithblogs.net/Erik/archive/2008/04/01/120915.aspx)代碼,我不得不包裝在雙重字符串和單引號。如果有效,我會進行必要的更改和更新。 –