XSLT中的累积变量

时间:2011-08-22 16:37:35

标签: xml xslt xpath

我有一个表,每行包含7列,并以5个单元格的形式:

 <ROW>
   <CELL ROWSPAN="1" COLSPAN="1">1</CELL>
   <CELL ROWSPAN="1" COLSPAN="1">Mandrel</CELL>
   <CELL ROWSPAN="1" COLSPAN="1">1</CELL>
   <CELL ROWSPAN="1" COLSPAN="2">H079249303</CELL>
   <CELL ROWSPAN="1" COLSPAN="2">H079249301</CELL>
 </ROW>

现在我的模板与每个人<CELL>匹配并将其转换为<entry>,对于那些@COLSPAN值大于1的人(如上面的最后两个单元格),我需要要为它们设置namestnamend属性,例如,上面的代码将变为:

  <row>
    <entry>1</entry>
    <entry>Mandrel</entry>
    <entry>1</entry>
    <entry namest="c4" nameend="c5">H079249303</entry>
    <entry namest="c6" nameend="c7">H079249301</entry>
  </row>

我能够跟踪前面兄弟的数量,但实际上不知道如何对所有前面兄弟的@COLSPAN属性求和,因为XSLT不允许变量增量。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

查看sum函数,即:

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="ROW">
    <row>
      <xsl:apply-templates select="CELL"/>
    </row>
  </xsl:template>

  <xsl:template match="CELL">
    <entry>
      <xsl:if test="@COLSPAN > 1">
        <xsl:attribute name="namest">
          <xsl:value-of select="concat('c', sum(preceding-sibling::CELL/@COLSPAN) + 1)"/>
        </xsl:attribute>

        <xsl:attribute name="nameend">
          <xsl:value-of select="concat('c', sum(preceding-sibling::CELL/@COLSPAN) + @COLSPAN)"/>
        </xsl:attribute>
      </xsl:if>

      <xsl:value-of select="."/>
    </entry>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<row>
  <entry>1</entry>
  <entry>Mandrel</entry>
  <entry>1</entry>
  <entry namest="c4" nameend="c5">H079249303</entry>
  <entry namest="c6" nameend="c7">H079249301</entry>
</row>