Xslt 一些正确的XPath表达式不';I don’我没有按预期工作

Xslt 一些正确的XPath表达式不';I don’我没有按预期工作,xslt,xpath,wix,Xslt,Xpath,Wix,在获取注册表数据后,我正在对WiX生成的文件进行XML转换。对于那些不熟悉WIX的人,只要考虑一下,我试着在XML文件上进行XML传输,不管它来自哪里。我遇到的问题是:当我像 match="node()[name() = 'File'][not(@KeyPath)]" 然后匹配工作正常,它会找到所有缺少KeyPath属性的文件节点,但是,如果我使用另一个XPath表达式,比如 match="//File[not(@KeyPath)]" 那它就找不到匹配的了 一般来说,我不能将标准XPath与

在获取注册表数据后,我正在对WiX生成的文件进行XML转换。对于那些不熟悉WIX的人,只要考虑一下,我试着在XML文件上进行XML传输,不管它来自哪里。我遇到的问题是:当我像

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>

.net
对

但是像
/bookstore/book[@lang='en']
这样的东西是行不通的。也许,我在XSL文件的开头缺少了一些描述,以便识别像这样的XPath。

这是因为XML文件中的节点几乎肯定位于名称空间中

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
那么你的匹配表达式就变成了

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

请发布一个可复制的示例-请参阅:。非常感谢,蒂姆!
<xsl:template match="//wix:File[not(@KeyPath)]" />
<xsl:template match="wix:File[not(@KeyPath)]" />