1

假设我有以下 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']" /> 

但这似乎不起作用。

4

1 回答 1

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)]" />
于 2012-09-06T22:05:43.997 回答