цикл xsl через значение аргумента - PullRequest
1 голос
/ 11 марта 2012

Возможно ли иметь 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>

Спасибо! * * 1004

1 Ответ

1 голос
/ 11 марта 2012

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