按和结果分组

时间:2019-07-18 11:25:26

标签: xslt xslt-2.0

我正在为客户端转换表,某些元素需要跨越多个列。每个元素都有属性aid:ccols,该属性指示此值应跨越多少列。我正在尝试对这些元素进行分组,直到aid:ccols的总和等于basictable/@aid:tcols,以此类推。

我使用xsl:for-eachgroup-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.&nbsp;Les «&nbsp;salaires&nbsp;» 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&nbsp;cours</td>
                 <td>Calculer le droit, au réel&nbsp;+ 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>

1 个答案:

答案 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单元格,因为我不确定是什么决定了这一点。