W3C XSLT 1.0规范为何未明确非根/元素节点的模式内置模板规则?
XSLT 1.0模式特定内置模板规则的规范疑问
W3C XSLT 1.0规范的5.8节(内置模板规则)明确列出了无模式(不带mode属性的<xsl:template>)情况下所有节点类型的内置模板规则及其行为。但在模式特定场景下,仅定义了根节点和元素节点的内置模板规则,等效形式如下:
<xsl:template match="*|/" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template>
规范未提及其他节点的模式特定内置模板规则,似乎暗示这类规则不存在。但实际测试证明它们确实存在:
测试示例
- 源文档:
<myelement attr="foo">TEXT</myelement>
- 样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="*|/"> <xsl:apply-templates select="myelement/text()" mode="m"/> <xsl:apply-templates select="myelement/@*" mode="m"/> </xsl:template> </xsl:stylesheet>
- 生成输出:
TEXTfoo
如果文本和属性节点没有对应的模式特定内置模板规则,不会产生上述输出。
核心疑问
这是规范的缺陷/遗漏,还是实际默认所有节点的模式特定内置模板规则与无模式场景行为一致?
进一步简化问题:以下模板规则是否在模式特定场景下被隐式定义?
<xsl:template match="text()|@*" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template>
规范对此表述模糊,仅提及了根和元素节点的模式特定内置模板规则。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

