2012-03-11 1 views
1

Возможно ли иметь для каждого, в котором счетчик является значением атрибута (а не списком узлов)? Вот что я пытаюсь сделать, обработку Colspan в таблицах (не работает):xsl loop through value value

 <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

В 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> 
+0

Спасибо, я использую Xalan так, к сожалению, нет XSLT 2.0 –