如何检测相同元素值的rowspan?

时间:2015-06-30 14:20:43

标签: xslt

我有以下输入:

<input>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>5</cell>
  </row>
  <row>
    <cell>5</cell>
  </row>
  <row>
    <cell>5</cell>
  </row>
  <row>
    <cell>4</cell>
  </row>
</input>

我希望得到以下输出:

<output>
  <row>
    <cell rowspan="4">7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell>7</cell>
  </row>
  <row>
    <cell rowspan="3">5</cell>
  </row>
  <row>
    <cell>5</cell>
  </row>
  <row>
    <cell>5</cell>
  </row>
  <row>
    <cell rowspan="1">4</cell>
  </row>
</output>

这意味着我只想在值相同的情况下添加rowspan。但是如何计算rowspan的价值?

我做了以下事情:

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

<xsl:template match="/">

<output>
  <xsl:for-each select="//input/row">
    <row>
      <cell>
        <xsl:if test="not(preceding-sibling::row[1]/cell = cell)">
          <xsl:attribute name="rowspan">?</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="cell" />
      </cell>
    </row>
  </xsl:for-each>
</output>

</xsl:template>

</xsl:stylesheet>

但我不知道如何计算rowspan的数字。

1 个答案:

答案 0 :(得分:0)

  

也许我会删除重复的单元格,这不是问题...

嗯,正如您将看到的那样,它会产生影响。

这是你可以看到的一种方式:

XSLT 1.0

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

<xsl:template match="/input">
    <xsl:variable name="total-rows" select="count(row)" />
    <output>
        <xsl:for-each select="row[not(cell=preceding-sibling::row[1]/cell)]">
            <row>
                <cell>
                    <xsl:if test="cell=following-sibling::row[1]/cell">
                        <xsl:variable name="p1" select="count(preceding-sibling::row)" />
                        <xsl:variable name="next-change" select="following-sibling::row[not(cell=current()/cell)][1]" />
                        <xsl:variable name="p2">
                            <xsl:choose>
                                <xsl:when test="$next-change">
                                    <xsl:value-of select="count($next-change/preceding-sibling::row)" />
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="$total-rows" />
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:variable>
                        <xsl:attribute name="rowspan">
                            <xsl:value-of select="$p2 - $p1" />
                        </xsl:attribute>
                    </xsl:if>
                    <xsl:value-of select="cell" />
                </cell>
            </row>
      </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

结果,当应用于您的示例输入时:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <row>
      <cell rowspan="4">7</cell>
   </row>
   <row>
      <cell rowspan="3">5</cell>
   </row>
   <row>
      <cell>4</cell>
   </row>
</output>

请注意,对前一个兄弟姐妹的这种不断计算效率不高;希望你不会有很多行。