Xslt 如何在xsl:copy中的所有非选定元素上执行应用模板?

Xslt 如何在xsl:copy中的所有非选定元素上执行应用模板?,xslt,apply-templates,Xslt,Apply Templates,假设我有以下XSLT: <xsl:template match="DTS:Executable[@DTS:ExecutableType='SSIS.Package.2' or @DTS:ExecutableType='MSDTS.Package.1']"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="./DTS

假设我有以下XSLT:

<xsl:template match="DTS:Executable[@DTS:ExecutableType='SSIS.Package.2' or @DTS:ExecutableType='MSDTS.Package.1']">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="./DTS:Property"/>
        <xsl:apply-templates select="./DTS:ConnectionManager"/>
        <xsl:apply-templates select="./DTS:Configuration"/>
        <xsl:apply-templates select="./DTS:LogProvider"/>
    </xsl:copy>
</xsl:template>

我意识到,如果还有其他节点类型,比如DTS:Variable,它们将从生成的XML中过滤出来,因为没有apply templates语句选择它们

我的问题是:如何使用apply templates语句来结束副本,该语句选择了前面apply templates语句中未指定的所有元素

我试过这样的方法:

    <xsl:apply-templates select="./node()[name!='DTS:Property' and name!='DTS:ConnectionManager' and name!='DTS:Configuration' and name!='LogProvider']" /> 


但是这似乎不起作用。

您应该在表达式中使用函数
name()
,而不仅仅是
name
。另外请注意,
/
在这里是多余的,所以您可以只写这个

<xsl:apply-templates select="node()[name()!='DTS:Property' and name()!='DTS:ConnectionManager' and name()!='DTS:Configuration' and name()!='LogProvider']" />

或者,写以下内容也可以更短

<xsl:apply-templates select="node()[not(self::DTS:Property|self::DTS:ConnectionManager|self::DTS:Configuration|self::LogProvider)]" />

第二个选项不仅更短,而且更正确,因为它不依赖使用特定名称空间前缀的源文档。它也可能更快,因为名称在编译时是已知的,这有助于优化器。