如何仅匹配xsl模板规则中的当前节点?

时间:2016-09-29 18:17:14

标签: xml xslt

我对xsl转换有以下输入:

<root>
    <Section>
        <Section>
            <Type>Table</Type>
        </Section>
    </Section>
</root>

我正在尝试应用模板,并且只匹配当前的Section节点,但xsl:template上的匹配表达式也会匹配任何子节。

有没有办法将匹配限制为仅当前节点?

我正在应用这个xsl样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/*">
        <output>
            <xsl:apply-templates select="Section" />
        </output>
    </xsl:template>

    <xsl:template match="Section[Type]">
        <xsl:value-of select="." />
    </xsl:template>

    <xsl:template match="text()" />

</xsl:stylesheet>

输出结果为:

<output>
        Table
</output>

匹配Section[Type]的模板与子部分匹配,但我要查找的结果是调用<xsl:apply-templates select="Section" />时,不应匹配任何内容,因为当前部分没有Type元素。

或者,我是否必须在这种情况下使用呼叫模板?

另一个选项是匹配on Section / Type,但我想避免在exssion中使用..来回到父节点,只是为了清晰起见。

1 个答案:

答案 0 :(得分:4)

您的困惑是因为XSLT的built-in templates,当XSLT处理器在您的XSLT文件中找不到匹配的模板时会应用它。在你的情况下,当你这样做...

<xsl:apply-templates select="Section" />

它将查找与第一个Section匹配的模板,但您的XSLT中没有匹配的模板,因为您所拥有的模板仅匹配具有子Section的{​​{1}}元素}。然后内置模板启动,这实际上就是这个..

Type

也就是说,它将应用与子元素匹配的模板;你的小节。

解决方案是在XSLT中为<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> 添加匹配模板

Section

由于这不是使用条件量化的,因此如果您的XSLT中只有一个<xsl:template match="Section" /> ,则优先级低于匹配Section[Type]的优先级。

试试这个XSLT

Section

应用于您的XML,它只输出<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/*"> <output> <xsl:apply-templates select="Section" /> </output> </xsl:template> <xsl:template match="Section" /> <xsl:template match="Section[Type]"> <xsl:value-of select="." /> </xsl:template> <xsl:template match="text()" /> </xsl:stylesheet> ,但如果您要将其应用于此...

<output/>

输出就是这个......

<root>
    <Section>
        <Type>Table</Type>
    </Section>
</root>

您可以在http://www.w3.org/TR/xslt#conflict

上阅读模板优先级