我正在为客户端转换表,某些元素需要跨越多个列。每个元素都有属性aid:ccols
,该属性指示此值应跨越多少列。我正在尝试对这些元素进行分组,直到aid:ccols
的总和等于basictable/@aid:tcols
,以此类推。
我使用xsl:for-each
,group-by
尝试了多种方法,但似乎无济于事。
<basictable xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" aid:table="table" aid:trows="7" aid:tcols="3">
<cell-tab-tit-center aid:table="cell" aid:crows="1" aid:ccols="3">1. Les « salaires » du mois</cell-tab-tit-center>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="67.53149606308261">Salaire mensuel</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="2">Arrêté à la date de rupture du contrat (fin du préavis, même en cas de dispense par l’employeur).</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="67.53149606308261">Rappels éventuels</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="2">Vérifier si des rappels restent dus.</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="67.53149606308261">Primes annuelles</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="2">Vérifier si les primes annuelles sont dues au prorata.</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="67.53149606308261">Ind. comp. cp N-1</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="147.40157480314957">Contrôler le solde de cp.</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="248.94881889754743">
comparaison maintien/10<superscript>e</superscript>
rém. de la période de réf. N-1.
</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="67.53149606308261">Ind. comp. cp en cours</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="147.40157480314957">Calculer le droit, au réel + règle des équivalences, jusqu’à la fin du préavis.</cell-tab-txt-left>
<cell-tab-txt-left aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="248.94881889754743">
comparaison maintien/10<superscript>e</superscript>
rém. de la période en cours et jusqu’à la fin du préavis.
</cell-tab-txt-left>
<cell-tab-subtit-left aid:table="cell" aid:crows="1" aid:ccols="3">
<b>Permet d’obtenir le total du mois représentant du salaire</b>
</cell-tab-subtit-left>
</basictable>
结果应为
<table>
<tr>
<th colspan="3">1. Les « salaires » du mois</th>
</tr>
<tr>
<td>Salaire mensuel</td>
<td>Arrêté à la date de rupture du contrat (fin du préavis, même en cas de dispense par l’employeur).</td>
</tr>
<tr>
<td>Rappels éventuels</td>
<td>Vérifier si des rappels restent dus.</td>
</tr>
<tr>
<td>Primes annuelles</td>
<td>Vérifier si les primes annuelles sont dues au prorata.</td>
</tr>
<tr>
<td>Ind. comp. cp N-1</td>
<td>Contrôler le solde de cp.</td>
<td>
comparaison maintien/10
<superscript xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">e</superscript>
rém. de la période de réf. N-1.
</td>
</tr>
<tr>
<td>Ind. comp. cp en cours</td>
<td>Calculer le droit, au réel + règle des équivalences, jusqu’à la fin du préavis.</td>
<td>
comparaison maintien/10
<superscript xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">e</superscript>
rém. de la période en cours et jusqu’à la fin du préavis.
</td>
</tr>
.
.
.
</table>
我的代码:
<xsl:template match="cell-tab-txt-right | cell-tab-subtit-left | cell-tab-txt-center | cell-tab-txt-left | cell-tab-subtit-right | cell-tab-subtit-center | cell-tab-tit-center | cell-tab-tit-right | cell-tab-tit-left">
<xsl:param name="columns" tunnel="yes"/>
<xsl:if test="$columns != 0">
<xsl:choose>
<xsl:when test="@aid:ccols = $columns">
<xsl:element name="tr">
<xsl:element name="th">
<xsl:attribute name="colspan"><xsl:value-of select="@aid:ccols"></xsl:value-of></xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="tr">
<xsl:apply-templates select=".|following-sibling::*[1][position() + (@aid:ccols - 1) $lt; $columns]" mode="list"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
答案 0 :(得分:0)
在https://xsltfiddle.liberty-development.net/bFN1yaa/2,我尝试将xsl:iterate
示例从注释转换为同级递归:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
exclude-result-prefixes="#all"
version="2.0">
<xsl:output method="html" indent="yes" version="5"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="basictable">
<table>
<xsl:variable name="max-cols" select="xs:integer(@aid:tcols)"/>
<xsl:apply-templates select="*[1]" mode="row">
<xsl:with-param name="max-cols" select="$max-cols"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="basictable/*" mode="row">
<xsl:param name="max-cols"/>
<xsl:param name="cells" select="()"/>
<xsl:variable name="current-cells" select="$cells, ."/>
<xsl:variable name="sum-cells" select="sum($current-cells/@aid:ccols)"/>
<xsl:if test="$sum-cells eq $max-cols">
<tr>
<xsl:apply-templates select="$current-cells"/>
</tr>
</xsl:if>
<xsl:apply-templates select="following-sibling::*[1]" mode="row">
<xsl:with-param name="cells" select="if ($sum-cells eq $max-cols) then () else $current-cells"/>
<xsl:with-param name="max-cols" select="$max-cols"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="basictable/*">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>
</xsl:stylesheet>
我认为将basictable
的子项归为tr
的工作方式与xsl:iterate
样本相同,在两个样本中我都没有尝试实现{{1} }和colspan
单元格,因为我不确定是什么决定了这一点。