XSL模板可以匹配* ALL *模式吗?

时间:2009-01-26 12:19:56

标签: xslt

有没有办法编写一个在所有模式下匹配的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" />

3 个答案:

答案 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   总共匹配的模板   模式

是的,为了做到这一点,应该遵循这两个规则

  1. 将模板编写为没有模式属性

  2. 在已模板化的模板中,{strong}指令没有模式属性,这将导致上面的模板被选中进行处理

  3. 这直接来自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)

如果您想在所有模式下匹配模板,那么为什么使用模式?如果您不使用模式,则将始终使用该模板。模式的原因是有条件地使用相同的数据类型执行不同的操作。好像你想要无模式。