我不确定这是否可能,但我们走了。
我有一个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-or-CLM-or-TOTATALS节点,则只处理30个PROV-or-CLM-or-TOTATALS节点。如果剩余节点数小于30,则对整个xml文件执行此操作以处理它们以完成转换。
我正在使用以下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>  </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>  </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>
我目前的情况是分裂不起作用&amp;我得到异常:线程“AWT-EventQueue-2”中的异常java.lang.OutOfMemoryError:Java堆空间尽管分配了-Xms / -Xmx2G内存。
答案 0 :(得分:1)
(实际上,我怀疑每个PROV中只有一个TOTALS,所以你的代码就可以了。)
此外,根据我的描述和评论的理解,你试图一次写出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循环中,导致每个table-row被包装在一个新的table-body中。这是不必要的。将表体移动到内环的外部。你只需要一行包装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>  </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>  </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循环,但它可能是由其他东西引起的。例如,一个简单到大的表,或者太大而无法渲染的文档也可能是原因。上面的代码应该相当有效。如果它仍然给你带来麻烦,请尝试从命令行处理事情,甚至可能使用不同的解析器。
答案 1 :(得分:0)
嗯..我没有时间详细查看你的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>
答案 2 :(得分:0)
您可以修改xsl:for-each语句,将它们限制为前30项:
<xsl:for-each select="ROOT/MEM-STMT/ACC/PROV[position()<=30]">
或者您可以将xsl:for-each
逻辑提取到模板中,然后仅选择前30个模板来应用模板:
<xsl:apply-templates select="ROOT/MEM-STMT/ACC/PROV[position()<=30]"/>