2010-09-29 47 views
2

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

实施例:

源的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> 

回答

2

简单的答案:模式匹配。

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

二简单的答案:当你需要的变量或引用PARAM(您不能在模式使用),请使用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