XSLT如何根据属性选择模板

时间:2010-09-29 14:23:19

标签: xslt

在样式表中,我想根据源xml中的属性选择一个模板。 不幸的是,看起来好像不能使用apply-templates的mode属性,因为它必须是qname文字。 还有其他类似的方法吗?

示例:

source xml:

...
<document type="1">
    <item>...</item>
</document>
...

样式表:

...
<xsl:template match="document">
    <xsl:apply-templates select="item" mode="{@type}" />
</xsl:template>

<xsl:template match="item" mode="1">
    ...
</xsl:template>

<xsl:template match="item" mode="2">
    ...
</xsl:template>

1 个答案:

答案 0 :(得分:2)

简单回答:模式匹配。

<xsl:template match="item[../@type = 'whatever']"/>

第二个简单的答案:当你需要变量或参数引用时(你不能在模式中使用它们),使用xsl:choose指令。

<xsl:template match="item">
   <xsl:param name="pType"/>
   <xsl:choose>
      <xsl:when test="$pType = 'whatever'">
      </xsl:when>
      <xsl:when test="$pType = 'otherthing'">
      </xsl:when>
   </xsl:choose>
</xsl:template>

复杂答案:使用命名模板参考。

<xsl:variavle name="vTemplate" select="document('')/xsl:template/@name"/>

<xsl:template match="xsl:template/@name[.='typeA']" name="typeA">
   <xsl:param name="pContext"/>
</xsl:template>

<xsl:template match="xsl:template/@name[.='typeB']" name="typeB">
   <xsl:param name="pContext"/>
</xsl:template>

<xsl:template match="document">
   <xsl:apply-templates select="$vTemplate[.='typeA']">
      <xsl:with-param name="pContext" select="item"/>
   </xsl:apply-templates>
</xsl:template>

或者看看Dimitre的FXSL