XSLT如何基于属性选择模板

XSLT如何基于属性选择模板,xslt,Xslt,在样式表中,我想根据源xml中的属性选择一个模板。 不幸的是,似乎无法使用apply templates的mode属性,因为这必须是qname文本。 还有其他类似的方法吗 例如: 源xml: ... <document type="1"> <item>...</item> </document> ... 。。。 ... ... 样式表: ... <xsl:template match="document"> <

在样式表中,我想根据源xml中的属性选择一个模板。 不幸的是,似乎无法使用apply templates的mode属性,因为这必须是qname文本。 还有其他类似的方法吗

例如:

源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>
。。。
...
...

简单答案:模式匹配

<xsl:template match="item[../@type = 'whatever']"/>
复杂答案:使用命名模板引用

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

或者看看迪米特的

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