我有一个要删除的<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>
答案 0 :(得分:0)
这似乎是一项相当复杂的任务,可以在XSLT 3中使用xsl:iterate
用xsl: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>