Rozwodniona wersja problemu, który mam, jest taka. Dla pliku XML, takich jak:Jak dynamicznie zmieniać kolejność stron xslt na podstawie atrybutów węzła?
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item cols="1">Item 1</item>
<item cols="1">Item 2</item>
<item cols="1">Item 3</item>
<item cols="1">Item 4</item>
<item cols="1">Item 5</item>
<item cols="1">Item 6</item>
<item cols="1">Item 7</item>
<item cols="1">Item 8</item>
<item cols="1">Item 9</item>
<item cols="2">Item 10</item>
<item cols="1">Item 11</item>
<item cols="1">Item 12</item>
<item cols="1">Item 13</item>
<item cols="1">Item 14</item>
<item cols="1">Item 15</item>
<item cols="1">Item 16</item>
<item cols="1">Item 17</item>
<item cols="1">Item 18</item>
</items>
muszę być w stanie wydrukować „elementu, który ma«cols = 1»w jednym układzie strony kolumny, a” pozycja, że mają «cols = 2» w układ podwójnej strony kolumny. Kolejność przedmiotów musi zostać zachowana. Wszystkie ciągłe "elementy o tej samej wartości @cols muszą pojawiać się jako ciągły przepływ. Za każdym razem, gdy zmienia się wartość @cols, muszę przejść na nową stronę i zmienić układ, jeśli jest to konieczne.
robię coś takiego:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="one-column-page-master">
<fo:region-body margin-top="3cm" region-name="body" column-count="1"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="two-column-page-master">
<fo:region-body margin-top="3cm" region-name="body" column-count="2"/>
<fo:region-before region-name="header" extent="2cm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="one-column-page">
<fo:repeatable-page-master-reference master-reference="one-column-page-master"/>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="two-column-page">
<fo:repeatable-page-master-reference master-reference="two-column-page-master"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<xsl:for-each select="//item">
<xsl:choose>
<xsl:when test="@cols = preceding-sibling::item[1]/@cols">
<!--cols value hasn't changed, don't create a new page-sequence-->
<!--But we cannot directly add fo:flow as the child of fo:root! -->
<xsl:call-template name="itemtemplate"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="@cols = 1">
<fo:page-sequence master-reference="one-column-page">
<xsl:call-template name="itemtemplate"/>
</fo:page-sequence>
</xsl:when>
<xsl:otherwise>
<fo:page-sequence master-reference="two-column-page">
<xsl:call-template name="itemtemplate"/>
</fo:page-sequence>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</fo:root>
</xsl:template>
<xsl:template name="itemtemplate">
<fo:flow flow-name="body">
<fo:block margin-bottom="5cm">
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</xsl:template>
</xsl:stylesheet>
Oczywiście, problemem jest to, że albo trzeba zawierać < fo: page-sekwencję .. > w moim arkusza stylów, czy nie, nie może "dynamicznie" decydować o umieszczeniu jednego na podstawie atrybutów nuty. (Chyba że mam program meta, który tworzy dynamicznie arkusz stylów, ale miałem nadzieję, że osiągnę to za pomocą zwykłych statycznych arkuszy stylów).
Dobre pytanie. Zastanawiam się, czy funkcje grupowania XSLT 2.0 rozwiążą ten problem.Proszę pokazać pożądany wynikowy plik XML (FO) dla danych wejściowych próbki, abyśmy mogli lepiej zrozumieć, do czego celujesz. – LarsH