有没有办法编写一个在所有模式下匹配的XSL 1.0模板?
或者我是否必须为每种现有模式编写单独的模板(包括将来添加模式的其他模板)?
这就是我所拥有的:
<xsl:apply-templates mode="mode1" />
...
<xsl:apply-templates mode="mode2" />
...
<!-- Do not process text content of nodes no matter in what mode -->
<!-- Is there a way to have only one template here? -->
<xsl:template match="text()" mode="mode1" />
<xsl:template match="text()" mode="mode2" />
答案 0 :(得分:7)
预定义模式:#all
(仅适用于XSLT 2.0)。
编辑:使用1.0
复制共享模式行为<xsl:template match="/">
<xsl:variable name="choice" select="'a'"/><!-- input seed here -->
<xsl:choose>
<xsl:when test="$choice='a'">
<xsl:apply-templates mode="a"/>
</xsl:when>
<xsl:when test="$choice='b'">
<xsl:apply-templates mode="b"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="a">
[A]
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*" mode="b">
[B]
<xsl:apply-templates />
</xsl:template>
<xsl:template match="text()">
[ALL]
</xsl:template>
答案 1 :(得分:2)
有没有办法编写XSL 1.0 总共匹配的模板 模式
是的,为了做到这一点,应该遵循这两个规则:
将模板编写为没有模式属性。
在已模板化的模板中,{strong}指令没有模式属性,这将导致上面的模板被选中进行处理
这直接来自XSLT 1.0规范,which says :
如果
<xsl:apply-templates>
元素有xsl:apply-templates
属性,则仅适用 来自那些模板规则mode
xsl:template
元素mode
具有相同值的属性;如果xsl:apply-templates
元素没有 拥有mode
属性,然后适用 仅限于那些模板规则xsl:template
没有的元素mode
属性。
总结:每个处于不同模式的一组模板仍然可以以这种方式发布<xsl:apply-templates>
(如上所述),以便选择相同的特定单个模板在每种情况下处理。
答案 2 :(得分:1)
如果您想在所有模式下匹配模板,那么为什么使用模式?如果您不使用模式,则将始终使用该模板。模式的原因是有条件地使用相同的数据类型执行不同的操作。好像你想要无模式。