2017-01-11 60 views
1

我正在對收集註冊表數據後由WiX生成的文件進行一些XML轉換。對於那些不熟悉WiX的人,只要考慮我正在嘗試對XML文件進行XML傳輸,無論它來自何處。我遇到的問題是:當我使用XPath像某些正確的XPath表達式無法按預期方式工作

match="node()[name() = 'File'][not(@KeyPath)]" 

則匹配工作正常,並發現所有缺少的keyPath屬性,它的文件節點,但如果我使用XPath的另一種表達像

match="//File[not(@KeyPath)]" 

然後它找不到任何匹配。

總的來說,我也無法使用標準的XPath /,//,。,..,但是,下面在它的XPath例如一塊效果很好

<xsl:template match="node()[name() = 'File'] 
           [contains(@Source, 'First.dll') or 
           contains(@Source, 'Second.dll')] 
           [not(@Assembly)]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
      <xsl:attribute name="Assembly">.net</xsl:attribute> 
      <xsl:attribute name="KeyPath">yes</xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 

但類似/bookstore/book[@lang='en']是行不通的。也許,我在我的XSL文件的開始部分缺少一些描述,以便能夠識別這樣的Xpaths。

+0

請發佈一個可重現的例子 - 請參閱:[mcve]。 –

回答

3

這是因爲在XML文件中的節點幾乎肯定是在一個命名空間

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

你表達//File[not(@KeyPath)]正在尋找一個File元素是沒有命名空間。你需要在你的XSLT考慮命名空間

因此,綁定一個前綴,它的xsl:stylesheet是這樣的...

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" /> 

那麼你的比賽變得表達這個..

<xsl:template match="//wix:File[not(@KeyPath)]" /> 

事實上,//在這裏沒有必要在比賽中。這也可以工作

<xsl:template match="wix:File[not(@KeyPath)]" /> 
+0

非常感謝,蒂姆! –

相關問題