我对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中使用..
来回到父节点,只是为了清晰起见。
答案 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>
上阅读模板优先级