Aufteilung auf mehrere Container

Die Ausgabe des Planergebnisses kann auf mehrere Container verteilt werden. Dies ist z.B. sinnvoll, wenn eine variable Anzahl von Datensätzen ausgegeben werden soll, welche u.U. nicht in einen Container passt.

Folgende Punkte müssen für die Aufsplittung erfüllt sein:

  • Vorlage mit mehreren Containern, welchen das selbe cardo.Button-Plugin zugeordnet wurde
  • Transformation, die das Ergebnis anhand der übergebenen Containergrößen auf die verschiedenen Container aufteilt (indem im Ergebnis-HTML an den entsprechenden Stellen das Tag <HQPrintContainerChange> eingefügt wird)

Beschränkungen:

  • Es kann nur so viel Inhalt ausgegeben werden, wie Containerplatz vorgesehen ist. Alles andere wird abgeschnitten. Eventuell müssen also vorausschauend mehrere Überlaufcontainer angelegt werden.

Beispiel für die Aufteilung des Inhalts in der Transformation:

<xsl:template name="RenderContent">

  <!--Containerhöhen ermitteln-->
  <xsl:variable name="containerHeights">
    <!--Die Containergrößen sind in der Variable 'ContainerSizes' (String) verfügbar und dort jeweils mit '#' getrennt-->
    <xsl:for-each select="iduCore:StringSplit('#', /ButtonRow/btn:ButtonOptions/ButtonEnv/Variables/Var[@name = 'ContainerSizes'], true())">
      <ContainerHeight>
        <!--jeder Extent liegt im Format x|y|width|height vor, hier wird die Höhe extrahiert-->
        <xsl:value-of select="number(iduCore:StringSplit('|', ., true())[4])" />
      </ContainerHeight>
    </xsl:for-each>
  </xsl:variable>

  <!--Neuen Zähler für die Container initialisieren-->
  <xsl:variable name="temp1" select="iduCore:InitCounter('container', 1)" />

  <!--Aufteilung des Inhalts auf die verfügbaren Container-->

  <!--Offset, welcher in jedem Container zur Gesamthöhe dazugerechnet werden muss (hier für den Tabellenkopf)-->
  <xsl:variable name="offset" select="10" />
  <!--Höhe einer Tabellenzeile-->
  <xsl:variable name="rowHeight" select="9" />

  <!--Schleife über alle auszugebenden Datensätze-->
  <xsl:for-each select="/ButtonRow/Row/RowArray/Row">
    <!-- falls erste Zeile oder die aktuelle Zeile nicht mehr in den aktuellen Container passt ...-->
    <xsl:if test="position() = 1 or ($offset * iduCore:GetCounter('container') + position() * $rowHeight)
      &gt; sum(msxsl:node-set($containerHeights)/ContainerHeight[position() &lt;= iduCore:GetCounter('container')])">
      <!-- ... falls nicht die erste Zeile ...-->
      <xsl:if test="position() != 1">
        <!--... dann gibt es schon eine vorhergehende Tabelle -> diese abschließen und einen Containerwechsel markieren -->
        <xsl:call-template name="RenderTableEnd" />
        <HQPrintContainerChange />
        <!--Zähler auf den nächsten Container setzen-->
        <xsl:variable name="temp2" select="iduCore:IncreaseCounter('container')" />
      </xsl:if>
      <!--... neue Tabelle beginnen-->
      <xsl:call-template name="RenderTableStart" />
    </xsl:if>
    <!-- hier wird die aktuelle Tabellenzeile ausgegeben -->
    <xsl:call-template name="RenderTableRow" >
      <xsl:with-param name="data" select="." />
    </xsl:call-template>
    <!--falls es die letzte Zeile war, wird die aktuelle Tabelle hier noch abgeschlossen-->
    <xsl:if test="position() = count(/ButtonRow/Row/RowArray/Row)">
      <xsl:call-template name="RenderTableEnd" />
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template name="RenderTableStart">
  <xsl:text disable-output-escaping="yes">
    <![CDATA[
    <table cellpadding="4" style="border:1px solid black;border-collapse:collapse;width:100%;">
      <tbody>
        <tr style="font-style:italic;font-weight:bold;">
          <td style="border:1px solid black;">
            KITA
          </td>
          <td style="border:1px solid black;">
            Kinder
          </td>
          <td style="border:1px solid black;">
            Flurstück
          </td>
        </tr>
    ]]>
  </xsl:text>
</xsl:template>

<xsl:template name="RenderTableEnd">
  <xsl:text disable-output-escaping="yes">
    <![CDATA[
      </tbody>
    </table>
    ]]>
  </xsl:text>
</xsl:template>

<xsl:template name="RenderTableRow">
  <xsl:param name="data" />
  <tr>
    <td style="border:1px solid black;">
      <xsl:value-of select="$data/name" />
    </td>
    <td style="border:1px solid black;">
      <xsl:value-of select="$data/anzahl_kinder" />
    </td>
    <td style="border:1px solid black;">
      <xsl:value-of select="$data/flurstuecke/flurstueck/zaehler" />
      <xsl:if test="$data/flurstuecke/flurstueck/nenner != ''">
        /<xsl:value-of select="$data/flurstuecke/flurstueck/nenner" />
      </xsl:if>
    </td>
  </tr>
</xsl:template>

 

Wenn die Vorlage nun zwei Seiten hat, wobei auf der ersten ein Container und auf der zweiten Seite ein Überlaufcontainer für das cardo.Button-Plugin definiert sind, könnte die Ausgabe so aussehen:

Seite 1

Für die erste Seite wird aufgrund der obigen Höhenberechnung ermittelt, dass nur 3 Zeilen (+ Tabellenkopf) in den Container passen.

Seite 2

Hier werden alle restlichen Zeilen (im Beispiel verbleiben nur noch drei) ausgegeben.