Hi All,
I need to do a group within a group in XSLT 1.0. I'm using XALAN to
transform an xml into pdf via FOP 0.20.5. Here is my problem.
I have an xml document that has a list of questions and their
responses. These questions are divided up into sections such as
section 1-0-0 and 2-0-0 etc.
What I have to do is bring back a list of unique responses (no
repeats) for the questions in each section and a count for each
response. The responses can be anything. So what I need returned is
this:
Section Count
1-0-0
No 3
Yes 2
N/A 1
2-0-0
Not Documented 4
Approved 2
Yes 3
I have tried the meunchian grouping method but couldn't seem to get it
to work. The method I have now fails if there are 3 same responses in
a row. It puts the first response in the section with the previous
section. I pretty sure that it's happening because I'm using
preceding and following to check the responses but I can't think of
another way of doing this. Any suggestions?
My Stylesheet is attached: This is the section of the attached
stylesheet that returns the unique responses.
<!--brings back unique responses -->
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:choose>
<xsl:when test="sec_id">
<xsl:if test="not(audit_response/resp='')">
<xsl:if test="sec_id=$test">
<xsl:for-each
select="audit_response/resp[1][not(.=preceding::audit_response/resp[1])]
| audit_response/resp[1][not(.=following::audit_response/resp[1])]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</fo:block>
</fo:table-cell>
My Stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:java="http://xml.apache.org/xslt/java"
xmlns:exsl="http://exslt.org/common" xmlns:set="http://exslt.org/sets"
xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="exsl"
exclude-result-prefixes="set">
<xsl:output/>
<xsl:key name="response"
match="report/audit/questions/question/audit_response" use="resp"/>
<xsl:key name="responseNum" match="report/audit/questions/question"
use="resp_num"/>
<xsl:key name="car" match="report/audit/questions/question"
use="audit_response/corr_acts/corr_act"/>
<xsl:key name="response2" match="report/audit/questions/question"
use="audit_response/resp"/>
<xsl:key name="corracts" match="report/audit/questions/question"
use="audit_response/corr_acts/corr_act/id"/>
<xsl:key name="keys_sec_id" match="report/audit/questions/question"
use="sec_id"/>
<xsl:key name="resps" match="//resp" use="resp"/>
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="rptPages" page-height="10in"
page-width="8in" margin-top="1cm" margin-bottom=".5cm"
margin-left="1cm" margin-right="1cm">
<fo:region-body margin-bottom="1.5cm" margin-top="2cm"
keep-together.within-page="always">
</fo:region-body>
<fo:region-after region-name="rptFooter" extent="1cm"/>
<fo:region-before region-name="rptHeader" extent="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="rptPages" force-page-count="no-force">
<!-- REPORT HEADER -->
<fo:static-content flow-name="rptHeader">
<fo:table table-layout="fixed" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="6cm"/>
<fo:table-column column-width="9cm"/>
<fo:table-column column-width="3.5cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:external-graphic width="2.5in" height="0.75in"
src="file:xsl/IATAlogo.jpg" />
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell />
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="17pt" font="Arial" font-weight="bold">
<!-- <xsl:value-of select="report/audit/company_name" />-->
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>
<xsl:text disable-output-escaping="yes">&#160;</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt" font="Arial" font-weight="bold"
space-after="5px">Tally Report</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<!-- End of header section. Beginning of page footer -->
<fo:static-content flow-name="rptFooter">
<fo:block font-size="9pt" font-weight="normal">
<fo:table table-layout="fixed" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="7.5cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>
<xsl:text disable-output-escaping="yes">&#160;</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="9pt" font="Arial" font-weight="normal"
text-align="left">
<xsl:variable name="date">
<xsl:value-of select="date:date-time()"/>
</xsl:variable>
<xsl:value-of select="substring($date,1,10)"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center" font-size="6pt"
font-weight="normal">
<xsl:value-of select="report/AuditResponse/footerText"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="right" font-size="9pt"
font-weight="normal">Page <fo:page-number/>
/ <fo:page-number-citation ref-id="last-page"/></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:static-content>
<!-- beginning of region body and beginning of Page Header information-->
<fo:flow flow-name="xsl-region-body">
<fo:table table-layout="fixed" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="6cm"/>
<fo:table-column column-width="9cm"/>
<fo:table-column column-width="3.5cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt"
font-weight="bold">Customer:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt">
<xsl:value-of select="report/audit/customername"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="9pt" font="Arial"
font-weight="bold">Audit Location:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt">
<xsl:value-of select="report/audit/levelstring"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="9pt" font="Arial"
font-weight="bold">Audit Name:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt">
<xsl:value-of select="report/audit/auditname"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt"
font-weight="bold">Audit Date:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt">
<xsl:value-of select="report/audit/audit_date"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="9pt" font="Arial"
font-weight="bold">User Account:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" font-size="9pt">
<xsl:value-of select="report/audit/user_name"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell number-columns-spanned="4">
<fo:block border-bottom-style="solid"
border-top-style="thin" border-bottom-color="#000000"
border-top-color="#000000" border-bottom-width="thin"
border-top-width="thin" space-after="6px">
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row/>
<fo:table-row/>
</fo:table-body>
</fo:table>
<!-- beginning of test section -->
<fo:table table-layout="fixed" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="8cm"/>
<fo:table-column column-width="1cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-column column-width=".1cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font="Arial" text-align="left"
font-size="10pt" font-weight="bold" space-after="6px">
Sections
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
List #
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
Response
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
Tally
</fo:block>
</fo:table-cell>
<fo:table-cell/>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
CAR
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:table table-layout="fixed" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="8cm"/>
<fo:table-column column-width="1cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-column column-width=".1cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-body>
<xsl:for-each select="report/audit/questions/question">
<xsl:sort data-type="number" select="sec_id"/>
<xsl:sort data-type="number" select="sec_id"/>
<xsl:sort data-type="number" select="sub_sec_id"/>
<xsl:sort data-type="number" select="item_id"/>
<fo:table-row>
<xsl:choose>
<xsl:when test="sec_id">
<xsl:variable name="test" select="sec_id"/>
<xsl:if test="(sec_id >=0) and sub_sec_id=0 and item_id=0 ">
<fo:table-cell>
<fo:block font="Arial" text-align="left"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:value-of select="sec_id"/>-<xsl:value-of
select="sub_sec_id"/>-<xsl:value-of select="item_id"/>
<xsl:text
disable-output-escaping="yes">&#160;&#160;&#160;</xsl:text>
<xsl:value-of select="itemdescription"/>
</fo:block>
</fo:table-cell>
</xsl:if>
<!-- brings back a unique response number -->
<fo:table-cell />
<fo:table-cell >
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:if test="not(sec_id >=0 and sub_sec_id
>=0 and item_id=0)">
<xsl:if test="sec_id=$test">
<fo:block></fo:block>
<xsl:if test="not(audit_response/resp='')">
<xsl:for-each
select="audit_response/resp[1][not(.=preceding::audit_response/resp[1])]
| audit_response/resp[1][not(.=following::audit_response/resp[1])]">
<xsl:value-of select="../../resp_num"/>
</xsl:for-each>
</xsl:if>
</xsl:if>
</xsl:if>
</fo:block>
</fo:table-cell>
<!--brings back unique responses -->
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:choose>
<xsl:when test="sec_id">
<xsl:if test="not(audit_response/resp='')">
<xsl:if test="sec_id=$test">
<xsl:for-each
select="audit_response/resp[1][not(.=preceding::audit_response/resp[1])]
| audit_response/resp[1][not(.=following::audit_response/resp[1])]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</fo:block>
</fo:table-cell>
<!-- brings back a tally of the responses -->
<xsl:variable name="group"
select="audit_response/resp[1][not(.=preceding::audit_response/resp[1])]
| audit_response/resp[1][not(.=following::audit_response/resp[1])]"/>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="5px">
<xsl:if test="not(sec_id >=0 and sub_sec_id
>=0 and item_id=0)">
<xsl:if test="sec_id=$test">
<xsl:if test="$group != ''">
<xsl:choose> <!--begins the outside choose -->
<xsl:when test="sec_id">
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="5px">
<xsl:variable name="sec_id" select="sec_id"/>
<xsl:value-of
select="count(../question[sec_id =
$sec_id]/audit_response/resp[.=$group])"/>
</fo:block>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:if>
</xsl:if>
</fo:block>
</fo:table-cell>
<!-- brings back a count of the cars per answered question -->
<fo:table-cell />
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:if test="sec_id=$test">
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:variable name="sec_id" select="sec_id"/>
<xsl:if test="sec_id=$sec_id">
<xsl:if
test="count(audit_response/corr_acts/corr_act/id[not(*)]) >0">
<xsl:value-of
select="count(audit_response/corr_acts/corr_act/id[not(*)])"/>
</xsl:if>
</xsl:if>
</fo:block>
</xsl:if>
</fo:block>
</fo:table-cell>
</xsl:when>
</xsl:choose>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
<fo:table table-layout="fixed" space-before="7px" border="1"
border-style="solid" background-color="#EEEEEE"
inline-progression-dimension="18cm" cell-spacing="0" cell-padding="0">
<fo:table-column column-width="8cm"/>
<fo:table-column column-width="1cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-column column-width="2.5cm"/>
<fo:table-column column-width=".5cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font="Arial" text-align="left" font-size="10pt"
font-weight="bold" space-after="6px">
Report Summary Totals:
</fo:block>
</fo:table-cell>
<fo:table-cell/>
<fo:table-cell>
<fo:block font="Arial" text-align="right" font-size="10pt"
font-weight="bold" space-after="6px">
Responses
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
Total
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell/>
</fo:table-row>
</fo:table-body>
</fo:table>
<!-- table to bring back the responses and car tallies-->
<fo:table table-layout="fixed" border="1" border-style="solid"
background-color="#99FFFF" inline-progression-dimension="18cm"
cell-spacing="0" cell-padding="0">
<fo:table-column column-width="8cm"/>
<fo:table-column column-width="1cm"/>
<fo:table-column column-width="2cm"/>
<fo:table-column column-width="1.5cm"/>
<fo:table-column column-width="2.5cm"/>
<fo:table-column column-width=".5cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell/>
<fo:table-cell/>
<fo:table-cell>
<fo:block font="Arial" text-align="center" font-size="8pt"
font-weight="normal" space-before = "5px" space-after="2px">
<xsl:for-each
select="report/audit/questions/question[generate-id() =
generate-id(key('response2',audit_response/resp)[1])]">
<xsl:if test="not(audit_response/resp='')">
<fo:block></fo:block>
<xsl:value-of select="audit_response/resp"/>
</xsl:if>
</xsl:for-each>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font="Arial" text-align="center" font-size="8pt"
font-weight="normal" space-after="2px" >
<xsl:for-each
select="report/audit/questions/question[count(.| key('response2',
audit_response/resp)[1]) = 1]">
<xsl:if test="not(audit_response/resp='')">
<fo:block></fo:block>
<xsl:if
test="not(count(key('response2',audit_response/resp))=0)">
<xsl:value-of
select="count(key('response2',audit_response/resp))"/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell/>
<fo:table-cell/>
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="10pt" font-weight="bold" space-after="6px">
CARs
</fo:block>
</fo:table-cell>
<!-- brings back a count of the cars per answered question -->
<fo:table-cell>
<fo:block font="Arial" text-align="center"
font-size="8pt" font-weight="normal" space-after="2px">
<xsl:choose>
<xsl:when test="/report/audit/questions/question">
<xsl:if test="not(audit_response/resp='')">
<xsl:if test="not(audit_response/corr_acts/corr_act='')">
<xsl:if
test="not(audit_response/corr_acts/corr_act/id=0)">
<xsl:value-of select="count(//corr_act) div 2"/>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</fo:block>
</fo:table-cell>
</fo:table-row>
<!--end of CAR code -->
</fo:table-body>
</fo:table>
<fo:block id="last-page"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--