如何在xsl:copy中的所有非选定元素上执行apply-templates?

时间:2012-09-06 21:13:57

标签: 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: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']" /> 

但这似乎不起作用。

1 个答案:

答案 0 :(得分:2)

您应该在表达式中使用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)]" />