for循环并使用该值

时间:2015-04-20 12:49:02

标签: xslt xpath xslt-2.0

我在XML中使用以下行。

<tb class="3">
    <tr>
      <td>
        <b>English words </b>
      </td>
      <td>
        <b>Arabic </b>
      </td>
      <td al="r">
        <b>Arabic</b>
      </td>
    </tr>
    <tr>
      <td>bear </td>
      <td>ḍam</td>
      <td al="r">new</td>
    </tr>
</tb>

这是我的xslt。

<xsl:template name="table" match="tb">
    <table class="frame-all">
        <xsl:call-template name="cols"/>
        <xsl:apply-templates/>
    </table>
</xsl:template>
<xsl:template name="cols">
    <xsl:variable name="numbr" select="number(./@class)"/>
    <xsl:variable name="colcnt" select="format-number(100 div $numbr,'##.#')"/>
    <colgroup>
        <!-- I want the condition here-->
    </colgroup>
</xsl:template>

这给了我33.3的输出。我想创建3个cols(类属性值)。对于每个col,名称应为增量值。如下。

<col name="1" width="33.3"/>
<col name="2" width="33.3"/>
<col name="3" width="33.3"/>

请让我知道,我怎样才能得到上述结果。

由于

2 个答案:

答案 0 :(得分:1)

这是我的答案。

<xsl:template name="table" match="tb">
        <table class="frame-all">
            <xsl:call-template name="cols"/>
            <!--<xsl:apply-templates/>-->
        </table>
    </xsl:template>
    <xsl:template name="colgroup">
        <xsl:param name="count" select="./@cls"/>
        <xsl:param name="final" select="1"/>
        <xsl:variable name="colcnt" select="format-number(100 div number(./@cls),'##.#')"/>
        <col class="colnum-{$final} colname-col{$final} colwidth-{$colcnt}"></col>
        <xsl:if test="$final &lt; $count">
            <xsl:call-template name="colgroup">
                <xsl:with-param name="final" select="$final +1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <xsl:template name="cols">
        <xsl:variable name="numbr" select="number(./@cls)"/>
        <xsl:variable name="colcnt" select="format-number(100 div $numbr,'##.#')"/>
        <colgroup>
            <xsl:call-template name="colgroup"/>
        </colgroup>
        <xsl:for-each select="tr">
<xsl:apply-templates select="."/>       
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="tr">
        <tr>
        <xsl:apply-templates/>
        </tr>
    </xsl:template>

<xsl:template match="td">
<td>

<xsl:attribute name="align">
<xsl:choose>
    <xsl:when test="./@al='r'">
<xsl:text>right</xsl:text>  
    </xsl:when>
    <xsl:when test="./@al='c'">
<xsl:text>center</xsl:text> 
    </xsl:when>
    <xsl:otherwise>
<xsl:text>left</xsl:text>   
    </xsl:otherwise>
</xsl:choose>
</xsl:attribute>

<xsl:apply-templates/>
</td>
</xsl:template>

答案 1 :(得分:1)

如果您使用的是XSLT 2.0,那么在您的案例col元素中生成特定数量元素的一种方法是使用xsl:for-each的变体来执行特定次数的迭代

因此,您可以执行以下操作,而不是执行<xsl:call-template name="colgroup"/>来调用递归模板:

<colgroup>
   <xsl:for-each select="1 to xs:integer($numbr)">
      <col name="{.}" width="{$colcnt}"/>
   </xsl:for-each>
</colgroup>

请注意,您需要在样式表中定义xs名称空间前缀,如下所示

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                 xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">