如何使用xslt获取rowpan

时间:2019-03-09 16:41:21

标签: xslt xslt-2.0

我有一个要删除的<td>的xml文件。 我知道了,但是我想在删除td之后添加行跨度。

parent:tr/precedeing-sibling::tr/td[position()]/text() = curent()[position()]/tex()

<table>
    <tr>
        <td>Emp</td>
        <td>Salary</td>
        <td>Id</td>
        <td>Address</td>
        <td>contact</td>
    </tr>
    <tr>
        <td>SIngh</td>
        <td>50000</td>
        <td>01</td>
        <td>Delhi</td>
        <td>0112145</td>
    </tr>
    <tr>
        <td>SIngh</td>
        <td>50000</td>
        <td>02</td>
        <td>033</td>
        <td>045</td>
    </tr>
</table>

1 个答案:

答案 0 :(得分:0)

这似乎是一项相当复杂的任务,可以在XSLT 3中使用xsl:iteratexsl:for-each-group group-adjacent处理每一列以注入rowspan属性来解决。为了继续处理下一列,我在临时结果中保留了要消除的像元,但具有delete属性,以便在最后一步中可以将它们删除:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:mode name="delete-rows" on-no-match="shallow-copy"/>

  <xsl:template match="td[@delete]" mode="delete-rows"/>

  <xsl:output method="html" html-version="5"/>

  <xsl:template match="table">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:iterate select="1 to count(tr[1]/td)">
              <xsl:param name="rows" select="tr"/>
              <xsl:on-completion>
                  <xsl:apply-templates select="$rows" mode="delete-rows"/>
              </xsl:on-completion>
              <xsl:variable name="col" select="."/>
              <xsl:variable name="new-rows" as="element(tr)*">
                  <xsl:for-each-group select="$rows" group-adjacent="td[$col]">
                      <xsl:choose>
                          <xsl:when test="current-group()[2]">
                              <xsl:apply-templates select="current-group()">
                                  <xsl:with-param name="col" select="$col"/>
                              </xsl:apply-templates>                              
                          </xsl:when>
                          <xsl:otherwise>
                              <xsl:copy-of select="."/>
                          </xsl:otherwise>
                      </xsl:choose>
                  </xsl:for-each-group>                  
              </xsl:variable>
              <xsl:next-iteration>
                  <xsl:with-param name="rows" select="$new-rows"/>
              </xsl:next-iteration>
          </xsl:iterate>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="tr">
      <xsl:param name="col"/>
      <xsl:copy>
          <xsl:copy-of select="td[position() lt $col]"/>
          <xsl:choose>
              <xsl:when test="position() eq 1">
                  <td rowspan="{count(current-group())}">
                      <xsl:copy-of select="td[$col]/node()"/>
                  </td>
               </xsl:when>
               <xsl:otherwise>
                   <td delete="yes"/>
               </xsl:otherwise>
          </xsl:choose>          
          <xsl:copy-of select="td[position() gt $col]"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jyRYYia