2017-01-11 4 views
1

レジストリデータを収集した後にWiXで生成されたファイルに対してXML変換を行っています。 WiXに精通していない人には、どこから来てもXMLファイルでXML転送をしようとしていると考えてください。私は正しいXPath式が期待どおりに動作しない

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

のようなXPathを使用した場合、その後のマッチングが正常に動作し、私は、XPathの別の表現を使用する場合、それは、しかし、それにキーパス属性が欠落しているすべてのそれらのファイルのノードを検索します。私は経験してる問題がありますlike

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

それでも一致しません。 /、//、。..、しかし、それで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']のようなものが働かないと

一般的に、私は標準のXPathを使用することはできません。おそらく、私はこのようなXpathsの認識を可能にするために、私のXSLファイルの始めにいくつかの記述が欠落しています。

+0

[mcve]を参照してください。 –

答えて

3

XMLファイル内のノードは名前空間でほぼ確実

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

あるので、これはあなたの表現//File[not(@KeyPath)]が名前空間されていないFile要素を探しています。次に、あなたの一致式はこのなり

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

...そうのよう xsl:stylesheetでそれにプレフィックスをバインドし、だからあなたのXSLT名前空間のために

を考慮に入れる必要がある。..

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

実際には、//はここで一致する必要はありません。これでも動作します

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

ありがとう、ティム! –

関連する問題