我们说我有以下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']" />
但这似乎不起作用。
答案 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)]" />