xsl循环遍历参数值

时间:2012-03-11 15:25:09

标签: xslt xsl-fo

是否可以有一个for-each,其中计数器是属性值(不是节点列表)? 这是我想要做的,处理表中的colspan(不起作用):

        <xsl:for-each select=".//tr[1]//td">
            <xsl:choose>
                <xsl:when test="@colspan">
                    <xsl:for-each select="@colspan">
                        <fo:table-column/>
                    </xsl:for-each>
                </xsl:when>
                <xsl:otherwise><fo:table-column/></xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>

谢谢!

1 个答案:

答案 0 :(得分:1)

在XSLT 2.0中

<xsl:for-each select="1 to xs:integer(@colspan)">
 <fo:table-column/>
</xsl:for-each>

在XSLT 1.0中

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="table[@colspan]">
    <fo:table>
      <xsl:call-template name="generate"/>
    </fo:table>
 </xsl:template>

 <xsl:template name="generate">
  <xsl:param name="pTimes" select="@colspan"/>

  <xsl:if test="$pTimes > 0">
   <fo:table-column/>

   <xsl:call-template name="generate">
     <xsl:with-param name="pTimes" select="$pTimes -1"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<table colspan="3"/>

产生了想要的正确结果

<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:table-column/>
   <fo:table-column/>
   <fo:table-column/>
</fo:table>