[xsl] FW: Xslt that worked for fop0.20.2 no longer works at later versions

Subject: [xsl] FW: Xslt that worked for fop0.20.2 no longer works at later versions
From: "Hesselberth, Jan" <Jan.Hesselberth@xxxxxxxxxxxxxxxxxx>
Date: Thu, 24 Apr 2008 10:36:43 +0100
______________________________________________
From: 	Hesselberth, Jan
Sent:	24 April 2008 10:35
To:	'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
Subject:	Xslt that worked for fop0.20.2 no longer works at later
versions

Sorry,
It's difficult being unable to send attachments.

I have been using fop 0.20.2 to produce pdf documents from xml using
xsl.
The batch file for the process runs
java -Xms32m -Xmx256m -cp
d:\fop-0.20.2\build\fop.jar;d:\fop-0.20.2\lib\batik.jar;d:\fop-0.20.2\li
b\xalan-2.0.0.jar;d:\fop-0.20.2\lib\xerces-1.2.3.jar;d:\fop-0.20.2\lib\a
valon-framework-4.0.jar;d:\fop-0.20.2\lib\logkit-1.0b4.jar;d:\fop-0.20.2
\lib\jimi-1.0.jar org.apache.fop.apps.Fop %1 %2 %3 %4 %5 %6 %7 %8

I am trying to upgrade to a later version of fop such as fop-0.94 and I
am getting different results in the pdf. This is due to the generated
.fo being different.

The original document looked something like this but it's lost all it's
formatting in copying.

From: AA029 To: AA027
7777Y-04750	 1	 -22,221.15 	-22,221.15	 -68.78
	Total 		-22,221.15	 -22,221.15	 -68.78

8888D-04238 	1	 -74,144.82	 -74,144.82	 -229.48
	Total 		-73,033.52	 -74,144.82	 -229.48

9999F-04086 	1 	-36,469.80	 -36,469.80	 0.00	 Account
element not up to date
	Total 		-36,469.80	 -36,469.80	 0.00

9999K-02810 	1 	-64,926.50 	-64,926.50 	-177.83
	Total		-64,926.50 	-64,926.50	-177.83

.
.
.
Total Movement Acct: 	6 	-211,843.08 	-212,954.38 	-579.70



When I run under fop-0.94 using these jars the output is heading and one
record set per page.

fop.jar fop-sandbox.jar build\fop-hyph.jar xml-apis-1.3.02.jar
xercesImpl-2.7.1.jar xalan-2.7.0.jar serializer-2.7.0.jar
batik-all-1.6.jar xmlgraphics-commons-1.2.jar avalon-framework-4.2.0.jar
commons-io-1.3.1.jar
commons-logging-1.0.4.jar jimi-1.0.jar jai_core.jar jai_codec.jar
fop-hyph.jar

From: AA029 To: AA027
7777Y-04750 1 -22,221.15 -22,221.15 -68.78
Total -22,221.15 -22,221.15 -68.78
Total Movement Acct: 0 0.00 0.00 0.00
From: AA029 To: AA027
8888D-04238 1 -74,144.82 -74,144.82 -229.48
Total -73,033.52 -74,144.82 -229.48
Total Movement Acct: 0 0.00 0.00 0.00
From: AA029 To: AA027
9999F-04086 1 -36,469.80 -36,469.80 0.00 Account element not up to date
Total -36,469.80 -36,469.80 0.00
Total Movement Acct: 0 0.00 0.00 0.00



The problem seems to be with locally declared variables within an
xsl:for-each loop.
I declare a variable globally, then set the value locally just before
the </xsl:for-each>
When the processing moves back to the start on the xsl:for-each, the
variable has the value of the global variable.
Also the test for position no longer works - it seems to use the
position prior to the sort.

The loop that produces this output is below.

	<xsl:template name="assetResults">
		<xsl:for-each
select="//property[@type='MoveAssetSuccess']">

		<xsl:sort select="./property[@name='sourceSPV']"
data-type="text" order="ascending"/>
		<xsl:sort select="./property[@name='targetSPV']"
data-type="text" order="ascending"/>
		<xsl:sort
select="concat(substring(property[@name='mfAccNo'],1,5),substring(proper
ty[@name='mfAccNo'],8,5),substring(property[@name='mfAccNo'],6,2))"/>
		<fo:table space-after="10pt">
			<fo:table-column column-width="3.5cm"/>
			<fo:table-column column-width="2cm"/>
			<fo:table-column column-width="3cm"/>
			<fo:table-column column-width="3cm"/>
			<fo:table-column column-width="3cm"/>
			<fo:table-column column-width="6cm"/>
			<fo:table-body>
			<xsl:variable name="spv"
select="concat(./property[@name='sourceSPV'],./property[@name='targetSPV
'])"/>
				<xsl:choose>
				<xsl:when test="position()=1">
				<fo:table-row keep-together="always">
					<fo:table-cell>
						<fo:block
text-align="left" font-family="sans-serif" line-height="14pt"
font-size="10pt" font-weight="bold">
						<xsl:text>From:
</xsl:text><xsl:value-of select="./property[@name='sourceSPV']"/>
						</fo:block>
					</fo:table-cell>
					<fo:table-cell>
						<fo:block
text-align="left" font-family="sans-serif" line-height="14pt"
font-size="10pt" font-weight="bold">
						<xsl:text>To:
</xsl:text><xsl:value-of select="./property[@name='targetSPV']"/>
						</fo:block>
					</fo:table-cell>

				</fo:table-row>
				</xsl:when>
				<xsl:otherwise>
				<xsl:if
test="concat(./property[@name='sourceSPV'],./property[@name='targetSPV']
) != $lastSPV">

				<fo:table-row keep-together="always">
Do some total processing
				</fo:table-row>
				<fo:table-row break-before="page">
					<fo:table-cell>
						<fo:block
text-align="left" font-family="sans-serif" line-height="14pt"
font-size="10pt" font-weight="bold">
						<xsl:text>From:
</xsl:text><xsl:value-of select="./property[@name='sourceSPV']"/>
						</fo:block>
					</fo:table-cell>
					<fo:table-cell>
						<fo:block
text-align="left" font-family="sans-serif" line-height="14pt"
font-size="10pt" font-weight="bold">
						<xsl:text>To:
</xsl:text><xsl:value-of select="./property[@name='targetSPV']"/>
						</fo:block>
					</fo:table-cell>

				</fo:table-row>
				</xsl:if>
				</xsl:otherwise>
				</xsl:choose>
					<!--fo:table-row
keep-with-previous="keep"-->
						<!--fo:table-cell
keep-with-previous="keep">
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="left">

<xsl:apply-templates select="./property[@name='mfAccNo']"/>
							</fo:block>
						</fo:table-cell>
						</fo:table-row-->
						<xsl:for-each
select="descendant::property[@type='AccountElementFinancialInformationVO
']">
						<xsl:variable
name="elementNo" select="./property[@name='accountElementNumber']"/>
						<fo:table-row
keep-together="always">
						<fo:table-cell>
						<xsl:if
test="ancestor::property[@type='MoveAssetSuccess']/descendant::property[
@name='mfAccNo'] != $lastacc">
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="left">

<xsl:apply-templates
select="ancestor::property[@type='MoveAssetSuccess']/descendant::propert
y[@name='mfAccNo']"/>
							</fo:block>
						</xsl:if>
						</fo:table-cell>
						<!--fo:table-row
keep-with-previous="keep">
						<fo:table-cell>
						</fo:table-cell-->
						<fo:table-cell>
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="right">

<xsl:value-of select="$elementNo"/>

</fo:block>
						</fo:table-cell>
						<fo:table-cell>
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="right">

<xsl:choose>

<xsl:when
test="contains(./property[@name='currentBalance'],'E')">0.00</xsl:when>

<xsl:otherwise>

<xsl:value-of
select="format-number(translate(./property[@name='currentBalance'],'&#45
;&#46;','-.'),'#,.00')"/>

</xsl:otherwise>

</xsl:choose>

							</fo:block>
						</fo:table-cell>

Process the rest of the cells in the same way
						</fo:table-row>
						<xsl:variable
name="lastacc"
select="ancestor::property[@type='MoveAssetSuccess']/descendant::propert
y[@name='mfAccNo']"/>
						</xsl:for-each>
						<fo:table-row
keep-together="keep">
						<fo:table-cell>
						</fo:table-cell>
						<fo:table-cell>
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="right">
							Total
							</fo:block>

						</fo:table-cell>

Process the rest of the cells in the same way

						</fo:table-row>




						<xsl:if test="position()
= last()">
						<fo:table-row
keep-together="always">
							<fo:table-cell>
							<fo:block
space-before.optimum="5pt" space-after.optimum="5pt" font-size="10pt"
text-align="left" border-after-style="solid" border-after-width="1pt"
border-top-style="solid" border-top-width="1pt">
							Total Movement
							</fo:block>
						</fo:table-cell>
Process the rest of the cells in the same way

						</fo:table-row>
						</xsl:if>
				</fo:table-body>
		</fo:table>
		<xsl:variable name="lastSPV"
select="concat(./property[@name='sourceSPV'],./property[@name='targetSPV
'])"/>
		<xsl:variable name="followingSPV"
select="concat(following::property[@name='sourceSPV'],following::propert
y[@name='targetSPV'])"/>

		</xsl:for-each>
	</xsl:template>



Here is some sample xml that can be used with the xsl in the original
post.


<?xml version="1.0" encoding="UTF-8"?>
<moveAssetBatchResults>
	<property type="MoveAssetResultCVO">
		<property name="moveAssetResults" type="ArrayList">
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;36469&#46;799999999996</property>
				<property name="clasAccNo"
type="String">123456</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance"
type="Double">&#45;36469&#46;799999999996</property>
						<property
name="clasAccountNumber" type="String">123456</property>
						<property
name="capPeriodStartDate" type="Date">2007&#45;12&#45;08
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;36469&#46;8</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;07
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="null"/>
						<property
name="mainframeAccountNumber" type="String">9999F&#45;04086</property>
						<property
name="interestRate" type="Double">9&#46;84</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">0&#46;0</property>
				<property name="mfAccNo"
type="String">9999F&#45;04086</property>
				<property name="currentBalance"
type="Double">&#45;36469&#46;8</property>
				<property name="targetSPV"
type="String">AA027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList">
					<property
type="SecuritisationProcessErrorVO">
						<property
name="errorText" type="String">Account element not up to date</property>
						<property
name="accountElementNumber" type="Integer">1</property>
						<property
name="clasAccountNumber" type="String">70139475</property>
						<property
name="mainframeAccountNumber" type="String">9999F&#45;04086</property>
					</property>
				</property>
				<property name="sourceSPV"
type="String">AA029</property>
			</property>
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;12694&#46;000000000002</property>
				<property name="clasAccNo"
type="String">12346</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance"
type="Double">&#45;12694&#46;000000000002</property>
						<property
name="clasAccountNumber" type="String">12346</property>
						<property
name="capPeriodStartDate" type="Date">2007&#45;12&#45;15
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;12694&#46;0</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;14
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;96&#46;77</property>
						<property
name="mainframeAccountNumber" type="String">9999K&#45;02957</property>
						<property
name="interestRate" type="Double">9&#46;34</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">&#45;96&#46;77</property>
				<property name="mfAccNo"
type="String">9999K&#45;02957</property>
				<property name="currentBalance"
type="Double">&#45;12694&#46;0</property>
				<property name="targetSPV"
type="String">AA027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList"/>
				<property name="sourceSPV"
type="String">AA029</property>
			</property>
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;64926&#46;5</property>
				<property name="clasAccNo"
type="String">23456</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance" type="Double">&#45;64926&#46;5</property>
						<property
name="clasAccountNumber" type="String">23456</property>
						<property
name="capPeriodStartDate" type="Date">2008&#45;01&#45;01
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;64926&#46;5</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;31
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;177&#46;83</property>
						<property
name="mainframeAccountNumber" type="String">9999K&#45;02810</property>
						<property
name="interestRate" type="Double">7&#46;69</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">&#45;177&#46;83</property>
				<property name="mfAccNo"
type="String">9999K&#45;02810</property>
				<property name="currentBalance"
type="Double">&#45;64926&#46;5</property>
				<property name="targetSPV"
type="String">AA027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList"/>
				<property name="sourceSPV"
type="String">AA029</property>
			</property>
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;22221&#46;149999999998</property>
				<property name="clasAccNo"
type="String">44553</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance"
type="Double">&#45;22221&#46;149999999998</property>
						<property
name="clasAccountNumber" type="String">44553</property>
						<property
name="capPeriodStartDate" type="Date">2008&#45;01&#45;01
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;22221&#46;15</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;31
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;68&#46;78</property>
						<property
name="mainframeAccountNumber" type="String">7777Y&#45;04750</property>
						<property
name="interestRate" type="Double">8&#46;690000000000001</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">&#45;68&#46;78</property>
				<property name="mfAccNo"
type="String">7777Y&#45;04750</property>
				<property name="currentBalance"
type="Double">&#45;22221&#46;15</property>
				<property name="targetSPV"
type="String">AA027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList"/>
				<property name="sourceSPV"
type="String">AA029</property>
			</property>
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;18926&#46;800000000003</property>
				<property name="clasAccNo"
type="String">66554</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance"
type="Double">&#45;18926&#46;800000000003</property>
						<property
name="clasAccountNumber" type="String">66554</property>
						<property
name="capPeriodStartDate" type="Date">2008&#45;01&#45;01
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;18926&#46;8</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;31
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;51&#46;84</property>
						<property
name="mainframeAccountNumber" type="String">5566W&#45;04468</property>
						<property
name="interestRate" type="Double">7&#46;69</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">&#45;51&#46;84</property>
				<property name="mfAccNo"
type="String">5566W&#45;04468</property>
				<property name="currentBalance"
type="Double">&#45;18926&#46;8</property>
				<property name="targetSPV"
type="String">AA027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList"/>
				<property name="sourceSPV"
type="String">BB029</property>
			</property>
			<property type="MoveAssetSuccess">
				<property name="movement"
type="String">SUBSTITUTION</property>
				<property name="capitalBalance"
type="Double">&#45;32507&#46;850000000002</property>
				<property name="clasAccNo"
type="String">99887</property>
				<property
name="cofAccountElementFinancialInformationVOs" type="ArrayList">
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance" type="Double">&#45;22588&#46;11</property>
						<property
name="clasAccountNumber" type="String">99887</property>
						<property
name="capPeriodStartDate" type="Date">2008&#45;01&#45;01
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;22588&#46;11</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;31
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;61&#46;87</property>
						<property
name="mainframeAccountNumber" type="String">7788K&#45;04892</property>
						<property
name="interestRate" type="Double">7&#46;69</property>
						<property
name="accountElementNumber" type="Integer">1</property>
					</property>
					<property
type="AccountElementFinancialInformationVO">
						<property
name="capitalBalance"
type="Double">&#45;9919&#46;740000000002</property>
						<property
name="clasAccountNumber" type="String">99887</property>
						<property
name="capPeriodStartDate" type="Date">2008&#45;01&#45;01
00&#58;00&#58;00&#46;0</property>
						<property
name="currentBalance" type="Double">&#45;9919&#46;74</property>
						<property
name="capPeriodEndDate" type="Date">2008&#45;01&#45;31
00&#58;00&#58;00&#46;0</property>
						<property
name="accruedInterest" type="Double">&#45;30&#46;7</property>
						<property
name="mainframeAccountNumber" type="String">7788K&#45;04892</property>
						<property
name="interestRate" type="Double">8&#46;690000000000001</property>
						<property
name="accountElementNumber" type="Integer">2</property>
					</property>
				</property>
				<property name="interestROToDate"
type="Double">&#45;92&#46;57</property>
				<property name="mfAccNo"
type="String">7788K&#45;04892</property>
				<property name="currentBalance"
type="Double">&#45;32507&#46;85</property>
				<property name="targetSPV"
type="String">BB027</property>
				<property
name="cofUnallocatedTransactionVOs" type="ArrayList"/>
				<property name="unallocatedFundsAmount"
type="Double">0&#46;0</property>
				<property
name="cofSecuritisationProcessErrorVOs" type="ArrayList"/>
				<property name="sourceSPV"
type="String">AA029</property>
			</property>
		</property>
	</property>
</moveAssetBatchResults>



Any help appreciated.
Regards
	Jan



LEGAL NOTICE


The information contained in this e-mail and any attachments are private and
confidential.
This message is solely intended for a particular recipient, if you are not the
intended
recipient you are prohibited from storing, copying, disseminating or using the
information
in any way.  If you received this e-mail in error please notify the sender
immediately.
E-mail transmission cannot be guaranteed to be secure or error-free as
information could
be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or
contain viruses.
The sender therefore does not accept liability for any errors, viruses or
omissions in the
contents of this message, which arise as a result of transmission. This e-mail
is not
intended to create legally binding commitments on behalf of Northern Rock plc,
nor do its
contents reflect the corporate views or policies of Northern Rock plc.

Northern Rock plc,
Registered Office Northern Rock House Gosforth Newcastle upon Tyne NE3 4PL.
Registered in England, number 3273685. Telephone No: 0191 2857191

Northern Rock plc is authorised and regulated by the Financial Services
Authority for
deposit-taking; advising on and arranging mortgages and general insurance; and
for
introducing life assurance and investments.

______________________________________________________________________
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email
______________________________________________________________________

Current Thread