我有以下输入:
<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
的数字。
答案 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>
请注意,对前一个兄弟姐妹的这种不断计算效率不高;希望你不会有很多行。