xsl: for-each Split Records - PullRequest
       19

xsl: for-each Split Records

0 голосов
/ 25 ноября 2011

Я не уверен, возможно ли это вообще, но мы идем.

У меня есть XML-файл:

<ROOT>
  <MEM-STMT>   
    <COUNTRY>co</COUNTRY>   
    <CURRENCY>cu</CURRENCY>   
    <STMT>   
      <ST-NO>1</ST-NO>   
      <ST-DATE>21-JUL-11</ST-DATE>   
      <CC>21</CC>   
      <YY>11</YY>   
      <MM>07</MM>   
      <DD>21</DD>   
    </STMT>   
    <MEM-DET>   
      <MEM-NO>9</MEM-NO>   
      <MEM-PROD-LEV>24</MEM-PROD-LEV>   
      <MEM-OPTION>option</MEM-OPTION>   
      <MEM-EMP-NO/>   
      <MEM-EMP-NAME>name</MEM-EMP-NAME>   
    </MEM-DET>   
    <MEM-ADDR>   
      <MEM-NAME>name</MEM-NAME>   
      <MEM-ADDR1>                  Addr1</MEM-ADDR1>   
      <MEM-ADDR2>                           Addr2</MEM-ADDR2>   
      <MEM-ADDR3>                         Addr3</MEM-ADDR3>   
      <MEM-SUB>                            Sub</MEM-SUB>   
      <MEM-CITY>                          +2</MEM-CITY>   
      <MEM-REG>                   Employer:reg</MEM-REG>   
      <MEM-CNTRY/>   
      <MEM-PCODE/>   
      <MEM-EMPCODE/>   
    </MEM-ADDR>   
    <ACC>   
      <PROV>   
        <PR-NO>1</PR-NO>   
        <PR-NAME>  pr</PR-NAME>   
        <REF-NO>1</REF-NO>   
        <CLM>   
          <REF>1</REF>   
          <CL-DEP-NO>04</CL-DEP-NO>   
          <CL-DEP-NAME>dep</CL-DEP-NAME>   
          <CL-DOS>10-APR-11</CL-DOS>   
          <CC>21</CC>   
          <YY>11</YY>   
          <MM>04</MM>   
          <DD>10</DD>   
          <CL-TAR-DRUG-CD>1 </CL-TAR-DRUG-CD>   
          <CL-TAR-DRUG-DESC>desc </CL-TAR-DRUG-DESC>   
          <CL-NO>1</CL-NO>   
          <CL-LINE>2</CL-LINE>   
          <CL-AMT>16.8</CL-AMT>   
          <CL-TAR-AMT>16.8</CL-TAR-AMT>   
          <CL-PAID-PROV>16.8</CL-PAID-PROV>   
          <CL-PAID-MEM>0</CL-PAID-MEM>   
          <CL-RSN/>   
        </CLM>   
        <CLM>   
          <REF>1</REF>   
          <CL-DEP-NO>04</CL-DEP-NO>   
          <CL-DEP-NAME>dep </CL-DEP-NAME>   
          <CL-DOS>20-APR-11</CL-DOS>   
          <CC>21</CC>   
          <YY>11</YY>   
          <MM>04</MM>   
          <DD>20</DD>   
          <CL-TAR-DRUG-CD>1 </CL-TAR-DRUG-CD>   
          <CL-TAR-DRUG-DESC>desc </CL-TAR-DRUG-DESC>   
          <CL-NO>1</CL-NO>   
          <CL-LINE>2</CL-LINE>   
          <CL-AMT>50.4</CL-AMT>   
          <CL-TAR-AMT>50.4</CL-TAR-AMT>   
          <CL-PAID-PROV>50.4</CL-PAID-PROV>   
          <CL-PAID-MEM>0</CL-PAID-MEM>   
          <CL-RSN/>   
        </CLM>   
        <TOTALS>   
          <TOT-AMT>67.2</TOT-AMT>   
          <TOT-TAR-AMT>67.2</TOT-TAR-AMT>   
          <TOT-PAID-PROV>67.2</TOT-PAID-PROV>   
          <TOT-PAID-MEM>0</TOT-PAID-MEM>   
        </TOTALS>   
      </PROV>   
      <PROV>   
        <PR-NO>2</PR-NO>   
        <PR-NAME>  pr</PR-NAME>   
        <REF-NO>1</REF-NO>   
        <CLM>   
          <REF>1</REF>   
          <CL-DEP-NO>04</CL-DEP-NO>   
          <CL-DEP-NAME>dep</CL-DEP-NAME>   
          <CL-DOS>10-APR-11</CL-DOS>   
          <CC>21</CC>   
          <YY>11</YY>   
          <MM>04</MM>   
          <DD>10</DD>   
          <CL-TAR-DRUG-CD>1</CL-TAR-DRUG-CD>   
          <CL-TAR-DRUG-DESC>desc </CL-TAR-DRUG-DESC>   
          <CL-NO>1</CL-NO>   
          <CL-LINE>2</CL-LINE>   
          <CL-AMT>15</CL-AMT>   
          <CL-TAR-AMT>0</CL-TAR-AMT>   
          <CL-PAID-PROV>15</CL-PAID-PROV>   
          <CL-PAID-MEM>0</CL-PAID-MEM>   
          <CL-RSN/>   
        </CLM>   
        <TOTALS>   
          <TOT-AMT>15</TOT-AMT>   
          <TOT-TAR-AMT>0</TOT-TAR-AMT>   
          <TOT-PAID-PROV>15</TOT-PAID-PROV>   
          <TOT-PAID-MEM>0</TOT-PAID-MEM>   
        </TOTALS>   
      </PROV>   
      <PROV>   
        <PR-NO>1</PR-NO>   
        <PR-NAME>  pr</PR-NAME>   
        <REF-NO>I0428202</REF-NO>   
        <CLM>   
          <REF>I0428202</REF>   
          <CL-DEP-NO>03</CL-DEP-NO>   
          <CL-DEP-NAME>dep</CL-DEP-NAME>   
          <CL-DOS>10-APR-11</CL-DOS>   
          <CC>21</CC>   
          <YY>11</YY>   
          <MM>04</MM>   
          <DD>10</DD>   
          <CL-TAR-DRUG-CD>2</CL-TAR-DRUG-CD>   
          <CL-TAR-DRUG-DESC>desc</CL-TAR-DRUG-DESC>   
          <CL-NO>112153</CL-NO>   
          <CL-LINE>217615</CL-LINE>   
          <CL-AMT>31.58</CL-AMT>   
          <CL-TAR-AMT>0</CL-TAR-AMT>   
          <CL-PAID-PROV>31.58</CL-PAID-PROV>   
          <CL-PAID-MEM>0</CL-PAID-MEM>   
          <CL-RSN/>   
        </CLM>   
        <TOTALS>   
          <TOT-AMT>31.58</TOT-AMT>   
          <TOT-TAR-AMT>0</TOT-TAR-AMT>   
          <TOT-PAID-PROV>31.58</TOT-PAID-PROV>   
          <TOT-PAID-MEM>0</TOT-PAID-MEM>   
        </TOTALS>   
      </PROV>   
      <PROV>   
        <PR-NO>1</PR-NO>   
        <PR-NAME> pr</PR-NAME>   
        <REF-NO>0027579</REF-NO>   
        <CLM>   
          <REF>1</REF>   
          <CL-DEP-NO>04</CL-DEP-NO>   
          <CL-DEP-NAME>dep</CL-DEP-NAME>   
          <CL-DOS>09-JUN-11</CL-DOS>   
          <CC>21</CC>   
          <YY>11</YY>   
          <MM>06</MM>   
          <DD>09</DD>   
          <CL-TAR-DRUG-CD>99200 </CL-TAR-DRUG-CD>   
          <CL-TAR-DRUG-DESC>desc</CL-TAR-DRUG-DESC>   
          <CL-NO>1</CL-NO>   
          <CL-LINE>1</CL-LINE>   
          <CL-AMT>12</CL-AMT>   
          <CL-TAR-AMT>0</CL-TAR-AMT>   
          <CL-PAID-PROV>12</CL-PAID-PROV>   
          <CL-PAID-MEM>0</CL-PAID-MEM>   
          <CL-RSN/>   
        </CLM>   
        <TOTALS>   
          <TOT-AMT>12</TOT-AMT>   
          <TOT-TAR-AMT>0</TOT-TAR-AMT>   
          <TOT-PAID-PROV>12</TOT-PAID-PROV>   
          <TOT-PAID-MEM>0</TOT-PAID-MEM>   
        </TOTALS>   
      </PROV>   
    </ACC>   
    <RSN-LIST>   
      <RSN-ERR>????</RSN-ERR>   
      <RSN-DESC/>   
    </RSN-LIST>   
    <FIN-OTHER>   
      <FIN-DATE/>   
      <FIN-AMT>0</FIN-AMT>   
      <FIN-TT/>   
    </FIN-OTHER>   
    <GTOTALS>   
      <GTOT-AMT>125.78</GTOT-AMT>   
      <GTOT-TAR-AMT>67.2</GTOT-TAR-AMT>   
      <GTOT-PAID-PROV>125.78</GTOT-PAID-PROV>   
      <GTOT-PAID-MEM>0</GTOT-PAID-MEM>   
    </GTOTALS>   
    <MEM-GTOT>   
      <M-MESSAGE/>   
      <M-TOT-PAID-MEM>0</M-TOT-PAID-MEM>   
      <M-PMT-METH/>   
    </MEM-GTOT>   
    <FIN-BAL>   
      <FIN-BDATE>21-JUL-11</FIN-BDATE>   
      <FIN-BAMT>0</FIN-BAMT>   
      <FIN-BTT/>   
    </FIN-BAL>   
  </MEM-STMT>   
</ROOT> 

, и я хотел бы разделить записи, возвращенные изон использует следующую логику:

Если XML-файл имеет 30 или более узлов PROV-или-CLM-или-TOTATALS, то обрабатывать только 30 узлов PROV-или-CLM-или-TOTATALS.Сделайте это для всего XML-файла, если число оставшихся узлов меньше 30, обработайте их для завершения преобразования.

Я использую следующий xsl для этого:

<xsl:template name="PROVIDER">
<fo:page-sequence master-reference="global">
<fo:flow flow-name="xsl-region-body">
<fo:wrapper font-size="7pt" font-family="Helvetica">
<fo:block-container >
<xsl:variable name="CURRENCYSYMBOL"><xsl:value-of select="ROOT/MEM-STMT/CURRENCY"/></xsl:variable>
<xsl:for-each select="ROOT/MEM-STMT/ACC/PROV">
<xsl:if test="(position() mod 30 = 1)">
<fo:block >
    <fo:table table-layout="fixed" width="190mm" border-style="solid">
    <fo:table-column column-width="22mm"/>
    <fo:table-column column-width="16mm"/>
    <fo:table-column column-width="18mm"/>
    <fo:table-column column-width="39mm"/>
<!--    <fo:table-column column-width="15mm"/>  -->
    <fo:table-column column-width="20mm"/>
    <fo:table-column column-width="20mm"/>
    <fo:table-column column-width="20mm"/>
    <fo:table-column column-width="20mm"/>
    <fo:table-column column-width="15mm"/>

    <fo:table-header border="solid" >
        <fo:table-row  border-style="solid">
        <fo:table-cell  background-color="{$HeaderGray}" number-columns-spanned="9" padding="2pt">
            <fo:block font-size="7pt" text-align="left" font-weight="bold">Provider:
            <xsl:value-of select="PR-NO"/>-
            <xsl:value-of select="PR-NAME"/>
            <xsl:text>&#xA0;  </xsl:text>  Ref No:
            <xsl:value-of select="REF-NO"/>
            </fo:block>
        </fo:table-cell>
        </fo:table-row>

        <fo:table-row border-style="solid">
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Patient</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Serv Date</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Tariff/Drug</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Description</fo:block>
        </fo:table-cell>
    <!--    <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Claim No</fo:block>
        </fo:table-cell>     -->
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Claim Amount</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Tariff Amount</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Paid Provider</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Paid Member</fo:block>
        </fo:table-cell>
        <fo:table-cell border-style="solid" padding="2pt">
            <fo:block text-align="center" font-weight="bold">Reason</fo:block>
        </fo:table-cell>
        </fo:table-row>
    </fo:table-header>

<xsl:for-each select="./CLM">
    <xsl:if test="(position() mod 30 = 1)"> 
    <fo:table-body font-size="7pt">
    <fo:table-row>

        <fo:table-cell padding="2pt" >
            <fo:block>
            <xsl:value-of select="CL-DEP-NAME"/><xsl:text>&#xA0;  </xsl:text>
            <xsl:value-of select="CL-DEP-NO"/>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt" >
            <fo:block>
            <xsl:value-of select="CL-DOS"/>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt" >
            <fo:block>
            <xsl:value-of select="CL-TAR-DRUG-CD"/>
            </fo:block>
        </fo:table-cell>

        <fo:table-cell padding="2pt" >
            <fo:block>
            <xsl:value-of select="CL-TAR-DRUG-DESC"/>
            </fo:block>
        </fo:table-cell>
    <!--    <fo:table-cell padding="2pt">
            <fo:block>
            <xsl:value-of select="CL-NO"/>
            </fo:block>
        </fo:table-cell>  -->
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
            <xsl:if test="CL-AMT != '0'">
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(CL-AMT,'#,##0.00')"/>
            </xsl:if>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
            <xsl:if test="CL-TAR-AMT != '0'">
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(CL-TAR-AMT,'#,##0.00')"/>
            </xsl:if>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt" >
            <fo:block text-align="right">
            <xsl:if test="CL-PAID-PROV != '0'">
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(CL-PAID-PROV,'#,##0.00')"/>
            </xsl:if>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
            <xsl:if test="CL-PAID-MEM != '0'">
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(CL-PAID-MEM,'#,##0.00')"/>
            </xsl:if>
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
                <xsl:if test="CL-RSN != '????'">
                    <xsl:value-of select="CL-RSN"/>
                </xsl:if>
            </fo:block>
        </fo:table-cell>

    </fo:table-row>
    </fo:table-body>
    </xsl:if>
    </xsl:for-each>

    <xsl:for-each select="./TOTALS">
    <xsl:if test="(position() mod 30 = 1)">
    <fo:table-body font-size="7pt">

    <fo:table-row border-style="solid">

        <fo:table-cell padding="2pt" number-columns-spanned="4" >
            <fo:block >Totals for Invoice</fo:block>
        </fo:table-cell>

        <fo:table-cell padding="2pt" >
            <fo:block text-align="right">
        <!--    <xsl:if test="TOT-AMT != '0'">       -->
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(TOT-AMT,'#,##0.00')"/>
        <!--    </xsl:if>     -->
            </fo:block>
        </fo:table-cell >
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
        <!--    <xsl:if test="TOT-TAR-AMT != '0'">  -->
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(TOT-TAR-AMT,'#,##0.00')"/>
        <!--    </xsl:if>    -->
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
        <!--    <xsl:if test="TOT-PAID-PROV != '0'">    -->
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(TOT-PAID-PROV,'#,##0.00')"/>
        <!--    </xsl:if>    -->
            </fo:block>
        </fo:table-cell>
        <fo:table-cell padding="2pt">
            <fo:block text-align="right">
        <!--    <xsl:if test="TOT-PAID-MEM != '0'">   -->
                <xsl:value-of select="$CURRENCYSYMBOL"/>
                <xsl:value-of select="format-number(TOT-PAID-MEM,'#,##0.00')"/>
        <!--    </xsl:if>   -->
            </fo:block>
        </fo:table-cell>
        <fo:table-cell >
            <fo:block>

            </fo:block>
        </fo:table-cell>
    </fo:table-row>
    </fo:table-body>
    </xsl:if>
    </xsl:for-each>
    </fo:table>
</fo:block>
</xsl:if>
</xsl:for-each>
</fo:block-container>
</fo:wrapper>
</fo:flow>
</fo:page-sequence>

Мой текущий сценарий таков, что разделение не работает, и я получаю исключение: исключение в потоке "AWT-EventQueue-2" java.lang.OutOfMemoryError: пространство кучи Java несмотря на выделение -Xms /-Xmx2G память.

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Камза, ты правильно понял это, но в твоем подходе есть несколько недостатков.Вы начинаете с for-each для элементов PROV, а внутри for-each у вас есть if, который приводит к записи выходных данных только для элементов PROV 1, 31, 61 и т. Д. Вложенные циклы for-each имеют похожую проблему.Только элемент CLM 1, 31, 61, .. написан, как и только ОБЩИЕ 1, 31, 61, ..

(На самом деле, я подозреваю, что будет только один ОБЩИЙ в каждом PROV, так что это будет нормальнов вашем коде.)

Более того, насколько я понимаю из вашего описания и комментариев, вы пытаетесь выписать 30 строк за раз и начать новую таблицу или даже новую страницу после этого., с еще 30 строк, или что осталось.Поскольку для самого элемента PROV не написано ни одной строки, я предполагаю, что речь идет о строках CLM и TOTALS, где в число 30 должны входить оба.

Для этого вам необходим внешний цикл for-eachкоторый проходит по всем элементам CLM и TOTALS.Вы можете использовать это выражение для этого:

    <xsl:for-each select="ROOT/MEM-STMT/ACC/PROV/*[self::CLM or self::TOTALS]">

Затем используйте, если вам уже нужно создать новую таблицу для строки 1, 31, 61, ...

Чтобы заполнить таблицус первыми-следующими 30 предметами, вам нужно будет смотреть вперед на 30 позиций.Элемент PROV здесь немного проблематичен.Предполагая, что CLM и TOTALS встречаются только в PROV, а PROV не используется где-либо еще, вы можете разумно безопасно использовать для этого следующую ось:

    <xsl:for-each select="(following::*[self::CLM or self::TOTALS])[30 >= position()]">

, которая возвращает 30 элементов, как CLM, так и TOTALS, но в документепорядок.Вам нужно два дополнительных if (или выбор), чтобы различать эти два, и вывести соответствующую строку таблицы:

    <xsl:if test="self::CLM">
        ...
    </xsl:if>
    <xsl:if test="self::TOTALS">
        ...
    </xsl:if>

В вашем коде у вас есть fo: table-body во внутренних циклах for-each,вызывая завершение каждой строки таблицы в новом теле таблицы.В этом нет необходимости.Переместите корпус стола наружу из внутренних петель.Вам понадобится только одна упаковка для обеих строк CLM и TOTALS.

Наконец, вы пишете новую таблицу для каждого 30-го элемента.Я думаю, что вы хотите начать новую последовательность страниц.Это приведет к тому, что каждая таблица будет отображаться на отдельной странице.Собрав все воедино, вы получите XSLT, похожий на этот:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:variable name="HeaderGray" select="'gray'"/>

    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="global">
                    <fo:region-body/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates select="/" mode="PROVIDER"/>

        </fo:root>
    </xsl:template>

    <xsl:template match="/" mode="PROVIDER">
        <xsl:variable name="CURRENCYSYMBOL" select="string(ROOT/MEM-STMT/CURRENCY)"/>

        <xsl:for-each select="ROOT/MEM-STMT/ACC/PROV/*[self::CLM or self::TOTALS]">
            <xsl:if test="position() mod 30 = 1">

                <fo:page-sequence master-reference="global">
                    <fo:flow flow-name="xsl-region-body">
                        <fo:wrapper font-size="7pt" font-family="Helvetica">
                            <fo:block-container>
                                <fo:block>
                                    <fo:table table-layout="fixed" width="190mm"
                                        border-style="solid">
                                        <fo:table-column column-width="22mm"/>
                                        <fo:table-column column-width="16mm"/>
                                        <fo:table-column column-width="18mm"/>
                                        <fo:table-column column-width="39mm"/>
                                        <!--    <fo:table-column column-width="15mm"/>  -->
                                        <fo:table-column column-width="20mm"/>
                                        <fo:table-column column-width="20mm"/>
                                        <fo:table-column column-width="20mm"/>
                                        <fo:table-column column-width="20mm"/>
                                        <fo:table-column column-width="15mm"/>

                                        <fo:table-header border="solid">
                                            <fo:table-row border-style="solid">
                                                <fo:table-cell background-color="{$HeaderGray}"
                                                  number-columns-spanned="9" padding="2pt">
                                                  <fo:block font-size="7pt" text-align="left"
                                                  font-weight="bold">Provider: <xsl:value-of
                                                  select="PR-NO"/>- <xsl:value-of select="PR-NAME"/>
                                                  <xsl:text>&#xA0;  </xsl:text> Ref No:
                                                  <xsl:value-of select="REF-NO"/>
                                                  </fo:block>
                                                </fo:table-cell>
                                            </fo:table-row>

                                            <fo:table-row border-style="solid">
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Patient</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Serv Date</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Tariff/Drug</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Description</fo:block>
                                                </fo:table-cell>
                                                <!--    <fo:table-cell border-style="solid" padding="2pt"> 
            <fo:block text-align="center" font-weight="bold">Claim No</fo:block> 
        </fo:table-cell>     -->
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Claim Amount</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Tariff Amount</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Paid Provider</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Paid Member</fo:block>
                                                </fo:table-cell>
                                                <fo:table-cell border-style="solid" padding="2pt">
                                                  <fo:block text-align="center" font-weight="bold"
                                                  >Reason</fo:block>
                                                </fo:table-cell>
                                            </fo:table-row>
                                        </fo:table-header>

                                        <fo:table-body font-size="7pt">
                                            <xsl:for-each
                                            select="(following::*[self::CLM or self::TOTALS])[30 >= position()]">
                                            <xsl:if test="self::CLM">
                                                  <fo:table-row>

                                                  <fo:table-cell padding="2pt">
                                                  <fo:block>
                                                  <xsl:value-of select="CL-DEP-NAME"/>
                                                  <xsl:text>&#xA0;  </xsl:text>
                                                  <xsl:value-of select="CL-DEP-NO"/>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block>
                                                  <xsl:value-of select="CL-DOS"/>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block>
                                                  <xsl:value-of select="CL-TAR-DRUG-CD"/>
                                                  </fo:block>
                                                  </fo:table-cell>

                                                  <fo:table-cell padding="2pt">
                                                  <fo:block>
                                                  <xsl:value-of select="CL-TAR-DRUG-DESC"/>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <!--    <fo:table-cell padding="2pt"> 
            <fo:block> 
            <xsl:value-of select="CL-NO"/> 
            </fo:block> 
        </fo:table-cell>  -->
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <xsl:if test="CL-AMT != '0'">
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(CL-AMT,'#,##0.00')"/>
                                                  </xsl:if>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <xsl:if test="CL-TAR-AMT != '0'">
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(CL-TAR-AMT,'#,##0.00')"/>
                                                  </xsl:if>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <xsl:if test="CL-PAID-PROV != '0'">
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(CL-PAID-PROV,'#,##0.00')"/>
                                                  </xsl:if>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <xsl:if test="CL-PAID-MEM != '0'">
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(CL-PAID-MEM,'#,##0.00')"/>
                                                  </xsl:if>
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <xsl:if test="CL-RSN != '????'">
                                                  <xsl:value-of select="CL-RSN"/>
                                                  </xsl:if>
                                                  </fo:block>
                                                  </fo:table-cell>

                                                  </fo:table-row>
                                            </xsl:if>
                                            <xsl:if test="self::TOTALS">

                                                  <fo:table-row border-style="solid">

                                                  <fo:table-cell padding="2pt"
                                                  number-columns-spanned="4">
                                                  <fo:block>Totals for Invoice</fo:block>
                                                  </fo:table-cell>

                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <!--    <xsl:if test="TOT-AMT != '0'">       -->
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(TOT-AMT,'#,##0.00')"/>
                                                  <!--    </xsl:if>     -->
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <!--    <xsl:if test="TOT-TAR-AMT != '0'">  -->
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(TOT-TAR-AMT,'#,##0.00')"/>
                                                  <!--    </xsl:if>    -->
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <!--    <xsl:if test="TOT-PAID-PROV != '0'">    -->
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(TOT-PAID-PROV,'#,##0.00')"/>
                                                  <!--    </xsl:if>    -->
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell padding="2pt">
                                                  <fo:block text-align="right">
                                                  <!--    <xsl:if test="TOT-PAID-MEM != '0'">   -->
                                                  <xsl:value-of select="$CURRENCYSYMBOL"/>
                                                  <xsl:value-of
                                                  select="format-number(TOT-PAID-MEM,'#,##0.00')"/>
                                                  <!--    </xsl:if>   -->
                                                  </fo:block>
                                                  </fo:table-cell>
                                                  <fo:table-cell>
                                                  <fo:block> </fo:block>
                                                  </fo:table-cell>
                                                  </fo:table-row>
                                            </xsl:if>
                                        </xsl:for-each>
                                        </fo:table-body>
                                    </fo:table>
                                </fo:block>

                            </fo:block-container>
                        </fo:wrapper>
                    </fo:flow>
                </fo:page-sequence>
            </xsl:if>
        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

Примечание. Я не совсем уверен, что это не даст вам получить исключение.У вас создалось впечатление, что это из-за ваших циклов for-each, но это может быть вызвано чем-то другим.Например, причиной может быть таблица большого размера или слишком большой для рендеринга документ.Приведенный выше код должен быть довольно эффективным.Если это все еще доставляет вам проблемы, попробуйте обработать что-либо из командной строки, возможно, даже используя другие парсеры.

0 голосов
/ 25 ноября 2011

Вы можете изменить свои операторы xsl: for-each, ограничив их первыми 30 элементами:

<xsl:for-each select="ROOT/MEM-STMT/ACC/PROV[position()&lt;=30]">

Или вы можете извлечь логику xsl:for-each в шаблоны, а затем выбрать только первые 30, к которым будут применяться шаблоны:

<xsl:apply-templates select="ROOT/MEM-STMT/ACC/PROV[position()&lt;=30]"/>
0 голосов
/ 25 ноября 2011

хм .. У меня нет времени, чтобы подробно рассмотреть ваш xslt, но ваша логика должна быть возможна, используя что-то вроде этого:

<xsl:template match="(//PROV | //CLM | //TOTALS)[position() <= 30]">
   <xsl:if test="local-name() = 'PROV'">
       <!-- do stuff with PROV node -->
   </xsl:if>
   <xsl:if test="local-name() = 'CLM'">
       <!-- do stuff with CLM node -->
   </xsl:if>
   <xsl:if test="local-name() = 'TOTALS'">
       <!-- do stuff with TOTALS node -->
   </xsl:if>
</xsl:template>
...