I have problem with setting fixed number of rows in my table.
I created table with similar code with this one:
<xsl:for-each select="DBData/tabulka1/Row[position() < 14]">
<tr>
<td><xsl:value-of select="ODESILATEL"/></td>
<td><xsl:value-of select="PREDMET"/></td>
<td align="right" class="sOkrajem"></td>
</tr>
</xsl:for-each>
And I need to fix number of rows to 15, even if I get a few records.
To example, if I get only 13 rows from database, so the two left rows will be empty, but will be there. For better understand, here is image:
http://imageshack.us/photo/my-images/692/tabulkar.png/
If will be neccesary, I can edit my SQL code.
Thanks for all advice. And sorry for representation of my problem.
edit. more extensive example of my code:
I have problem with setting fixed number of rows in my table.
I created table with similar code with this one:
<xsl:for-each select="DBData/tabulka1/Row[position() < 14]">
<tr>
<td><xsl:value-of select="ODESILATEL"/></td>
<td><xsl:value-of select="PREDMET"/></td>
<td align="right" class="sOkrajem"></td>
</tr>
</xsl:for-each>
And I need to fix number of rows to 15, even if I get a few records.
To example, if I get only 13 rows from database, so the two left rows will be empty, but will be there. For better understand, here is image:
http://imageshack.us/photo/my-images/692/tabulkar.png/
If will be neccesary, I can edit my SQL code.
Thanks for all advice. And sorry for representation of my problem.
edit. more extensive example of my latest use of code:
<?xml version="1.0" encoding="windows-1250"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="RolesPath" select="'%RolesPath%'"/>
<xsl:decimal-format decimal-separator=","
grouping-separator=" "/>
<xsl:include href="%RolesPath%\_foot.xsl" />
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>
<meta name="lang" content="cs" />
<meta http-equiv="Content-Type" content="text/xml; charset=windows-1250" />
<meta name="copyright" content="© 2009-2010 Flores" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body class ="teloBezObrazku">
<table width="95%" class="tabulka">
<th colspan="3" class="nadpis">Vzkazy</th>
<xsl:variable name="numRows" select="15" />
<xsl:variable name="rows" select="DBData/tabulka1/Row" />
<xsl:apply-templates select="$rows[position() <= $numRows]" />
<xsl:call-template name="AddRows">
<xsl:with-param name="numRows" select="$numRows - count($rows)" />
</xsl:call-template>
</table>
<span style="position: absolute; bottom: 10;">
Otevřít vše...<b class="cara">|</b>
Nový...
</span>
<xsl:call-template name="footer">
<xsl:with-param name="RolesPath" select="'%RolesPath%'"/>
</xsl:call-template>
</foot>
</html>
</xsl:template>
<!-- Separate templates -->
<xsl:template name="TableRow" match="tabulka1/Row">
<tr>
<td>
<xsl:value-of select="self::Row/ODESILATEL"/>
</td>
<td>
<xsl:value-of select="self::Row/PREDMET"/>
</td>
<td align="right" class="sOkrajem"></td>
</tr>
</xsl:template>
<xsl:template name="AddRows">
<xsl:param name="numRows" />
<xsl:if test="$numRows > 0">
<xsl:call-template name="TableRow" />
<xsl:call-template name="AddRows">
<xsl:with-param name="numRows" select="$numRows - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
edit. First line probably getting error.
<xsl:template name="tabulka1 | tabulka1/Row" mode="row">
<tr onmouseover="className='seda'" onmouseout="className='bila'" title="{OBSAH}" style="cursor:hand" xmlns="http://www.w3.org/1999/xhtml">
<a href="abrasite:A4NHDUKJESG4PJAVPQJFMAE2PS,0,DoShow;{ID}">
<xsl:choose>
<xsl:when test = "PRECTENO='N'">
<td align="left" class="sOkrajem"><b><xsl:value-of select="self::Row/ODESILATEL"/></b></td>
<td align="left" class="sOkrajem"><b><xsl:value-of select="self::Row/PREDMET"/></b></td>
<td align="right" class="sOkrajem">
<b><xsl:value-of select="self::Row/DATUM"/> <xsl:value-of select="self::Row/HODINY"/><xsl:value-of select="self::Row/MINUTY"/></b>
</td>
</xsl:when>
<xsl:otherwise>
<td align="left" class="sOkrajem"><xsl:value-of select="self::Row/ODESILATEL"/></td>
<td align="left" class="sOkrajem"><xsl:value-of select="self::Row/PREDMET"/></td>
<td align="right" class="sOkrajem">
<xsl:value-of select="self::Row/DATUM"/> <xsl:value-of select="self::Row/HODINY"/><xsl:value-of select="self::Row/MINUTY"/>
</td>
</xsl:otherwise>
</xsl:choose>
</a>
</tr>
</xsl:template>
You should be able to accomplish it like this (I've omitted the footer parts, which I don't have access to):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="RolesPath" select="'%RolesPath%'"/>
<xsl:decimal-format decimal-separator=","
grouping-separator=" "/>
<xsl:variable name="numRows" select="15" />
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>
<meta name="lang" content="cs" />
<meta http-equiv="Content-Type" content="text/xml; charset=windows-1250" />
<meta name="copyright" content="© 2009-2010 Flores" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body class ="teloBezObrazku">
<xsl:apply-templates select="DBData/tabulka1" />
<xsl:apply-templates select="DBData/tabulka2" />
<span style="position: absolute; bottom: 10;">
Otevřít vše...<b class="cara">|</b>
Nový...
</span>
</body>
</html>
</xsl:template>
<xsl:template name="TableRows">
<xsl:variable name="rows" select="Row" />
<xsl:apply-templates select="$rows[position() <= $numRows]" mode="row" />
<xsl:call-template name="AddRows">
<xsl:with-param name="numRows" select="$numRows - count($rows)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="AddRows">
<xsl:param name="numRows" />
<xsl:if test="$numRows > 0">
<xsl:apply-templates select="." mode="row" />
<xsl:call-template name="AddRows">
<xsl:with-param name="numRows" select="$numRows - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="tabulka1">
<table width="95%" class="tabulka" xmlns="http://www.w3.org/1999/xhtml">
<tr>
<th colspan="3" class="nadpis">Vzkazy</th>
</tr>
<xsl:call-template name="TableRows" />
</table>
</xsl:template>
<xsl:template match="tabulka1 | tabulka1/Row" mode="row">
<tr xmlns="http://www.w3.org/1999/xhtml">
<td>
<xsl:value-of select="self::Row/ODESILATEL"/>
</td>
<td>
<xsl:value-of select="self::Row/PREDMET"/>
</td>
<td align="right" class="sOkrajem"></td>
</tr>
</xsl:template>
<xsl:template match="tabulka2">
<table width="95%" class="tabulka" xmlns="http://www.w3.org/1999/xhtml">
<tr>
<th colspan="2" class="nadpis">Other Table</th>
</tr>
<xsl:call-template name="TableRows" />
</table>
</xsl:template>
<xsl:template match="tabulka2 | tabulka2/Row" mode="row">
<tr xmlns="http://www.w3.org/1999/xhtml">
<td>
<xsl:value-of select="self::Row/ODESILATEL2"/>
</td>
<td>
<xsl:value-of select="self::Row/PREDMET2"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
When run on this input XML:
<DBData>
<tabulka1>
<Row>
<ODESILATEL>Hello</ODESILATEL>
<PREDMET>1</PREDMET>
</Row>
<Row>
<ODESILATEL>Ciao</ODESILATEL>
<PREDMET>2</PREDMET>
</Row>
<Row>
<ODESILATEL>Hi</ODESILATEL>
<PREDMET>3</PREDMET>
</Row>
<Row>
<ODESILATEL>Bonjour</ODESILATEL>
<PREDMET>4</PREDMET>
</Row>
</tabulka1>
<tabulka2>
<Row>
<ODESILATEL2>Konnnichiwa</ODESILATEL2>
<PREDMET>1</PREDMET>
</Row>
<Row>
<ODESILATEL2>Wazzap</ODESILATEL2>
<PREDMET>2</PREDMET>
</Row>
<Row>
<ODESILATEL2>Buenos dias</ODESILATEL2>
<PREDMET>3</PREDMET>
</Row>
</tabulka2>
</DBData>
The result is:
<html xml:lang="cs" lang="cs" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="lang" content="cs" />
<meta http-equiv="Content-Type" content="text/xml; charset=windows-1250" />
<meta name="copyright" content="© 2009-2010 Flores" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body class="teloBezObrazku">
<table width="95%" class="tabulka">
<tr>
<th colspan="3" class="nadpis">Vzkazy</th>
</tr>
<tr>
<td>Hello</td>
<td>1</td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td>Ciao</td>
<td>2</td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td>Hi</td>
<td>3</td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td>Bonjour</td>
<td>4</td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
<tr>
<td></td>
<td></td>
<td align="right" class="sOkrajem" />
</tr>
</table>
<table width="95%" class="tabulka">
<tr>
<th colspan="2" class="nadpis">Other Table</th>
</tr>
<tr>
<td>Konnnichiwa</td>
<td></td>
</tr>
<tr>
<td>Wazzap</td>
<td></td>
</tr>
<tr>
<td>Buenos dias</td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
<span style="position: absolute; bottom: 10;">
Otevřít vše...<b class="cara">|</b>
Nový...
</span>
</body>
</html>
Related
I write xslt file using xsl fo to generate pdf document with table. I have xml file with several tags with the same name DataContainer example:
<tns:StructureData>
<tns:DataContainer>
<qwe:Data>
<asd:Name>Data1 1</asd:Name>
<asd:Value>100</asd:Value>
<qwe:Data>
<asd:Name>Data1 Inner 1</asd:Name>
<asd:Value>1000000</asd:Value>
</qwe:Data>
</qwe:Data>
<qwe:Data>
<asd:Name>Data1 2</asd:Name>
<asd:Value>200</asd:Value>
</qwe:Data>
<qwe:Data>
<asd:Name>Data1 3</asd:Name>
<asd:Value>300</asd:Value>
</qwe:Data>
<qwe:Data>
<asd:Name>Data1 4</asd:Name>
<asd:Value>400</asd:Value>
</qwe:Data>
</tns:DataContainer>
<tns:DataContainer>
<qwe:Data>
<asd:Name>Data2 1</asd:Name>
<asd:Value>45</asd:Value>
</qwe:Data>
<qwe:Data>
<asd:Name>Data2 2</asd:Name>
<asd:Value>55</asd:Value>
</qwe:Data>
<qwe:Data>
<asd:Name>Data2 3</asd:Name>
<asd:Value>65</asd:Value>
</qwe:Data>
<qwe:Data>
<asd:Name>Data2 4</asd:Name>
<asd:Value>75</asd:Value>
</qwe:Data>
</tns:DataContainer>
</tns:StructureData>
And I want to produce two tables for both DataContaienr tags like this:
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Data1 1</td>
<td>100</td>
</tr>
<tr>
<td>Data1 Inner 1</td>
<td>1000000</td>
</tr>
<tr>
<td>Data1 2</td>
<td>200</td>
</tr>
<tr>
<td>Data1 3</td>
<td>300</td>
</tr>
<tr>
<td>Data1 4</td>
<td>400</td>
</tr>
</table>
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Data2 1</td>
<td>45</td>
</tr>
<tr>
<td>Data2 2</td>
<td>55</td>
</tr>
<tr>
<td>Data2 3</td>
<td>65</td>
</tr>
<tr>
<td>Data2 4</td>
<td>75</td>
</tr>
</table>
I wrote this xslt:
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="30cm" page-width="24cm" margin-top="2cm" margin-bottom="2cm" margin-left="1cm" margin-right="1cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt" font-family="Arial">
<xsl:apply-templates select="/tns:StructureData/tns:DataContainer"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="/tns:StructureData/tns:DataContainer">
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="3cm" />
<fo:table-column column-width="10cm" />
<fo:table-header>
<fo:table-row border-width="1px" border-style="solid">
<fo:table-cell xsl:use-attribute-sets="marginColumnStyle">
<fo:block font-weight="bold">Name</fo:block>
</fo:table-cell>
<fo:table-cell xsl:use-attribute-sets="marginColumnStyle">
<fo:block font-weight="bold">Value</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:apply-templates select="/tns:StructureData/tns:DataContainer//*[contains(name(), 'qwe:')]"/>
</fo:table-body>
</fo:table>
</xsl:template>
<xsl:template match="/tns:StructureData/tns:DataContainer//*[contains(name(), 'qwe:')]">
<fo:table-row border-width="1px" border-style="solid">
<fo:table-cell>
<fo:block>
<xsl:value-of select="current()/asd:name"/>
</fo:block>
</fo:table-cell>
<fo:table-cell xsl:use-attribute-sets="centerCellStyle">
<fo:block>
<xsl:value-of select="current()/asd:value"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
But I get two tables withs data from two DataContainer tags. Result after execute above xslt file:
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Data1 1</td>
<td>100</td>
</tr>
<tr>
<td>Data1 Inner 1</td>
<td>1000000</td>
</tr>
<tr>
<td>Data1 2</td>
<td>200</td>
</tr>
<tr>
<td>Data1 3</td>
<td>300</td>
</tr>
<tr>
<td>Data1 4</td>
<td>400</td>
</tr>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Data2 1</td>
<td>45</td>
</tr>
<tr>
<td>Data2 2</td>
<td>55</td>
</tr>
<tr>
<td>Data2 3</td>
<td>65</td>
</tr>
<tr>
<td>Data2 4</td>
<td>75</td>
</tr>
</table>
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Data1 1</td>
<td>100</td>
</tr>
<tr>
<td>Data1 Inner 1</td>
<td>1000000</td>
</tr>
<tr>
<td>Data1 2</td>
<td>200</td>
</tr>
<tr>
<td>Data1 3</td>
<td>300</td>
</tr>
<tr>
<td>Data1 4</td>
<td>400</td>
</tr>
<tr>
<td>Data2 1</td>
<td>45</td>
</tr>
<tr>
<td>Data2 2</td>
<td>55</td>
</tr>
<tr>
<td>Data2 3</td>
<td>65</td>
</tr>
<tr>
<td>Data2 4</td>
<td>75</td>
</tr>
</table>
How I can get separated table for any DataContainer tag? I try some several ways to achieve this but none resolved my problem.
You probably want to replace this line....
<xsl:apply-templates select="/tns:StructureData/tns:DataContainer//*[contains(name(), 'qwe:')]"/>
With this line....
<xsl:apply-templates select=".//*[contains(name(), 'qwe:')]"/>
Or, better still...
<xsl:apply-templates select=".//qwe:*"/>
In the former case, you are selecting the child elements of all DataContainer elements in the document, whereas in the latter case, you are only selecting the descendants of the DataContainer you are currently matching.
As an aside, you don't necessarily need to put the full path to an element in a template match (not unless that element may occur at different levels in the document, and you just want to target one in a given place)
So, this template match...
<xsl:template match="/tns:StructureData/tns:DataContainer">
Could be simplified to just this...
<xsl:template match="tns:DataContainer">
See a simplified version at http://xsltfiddle.liberty-development.net/6r5Gh2L
I Have a Attribute that I want to display, but I only want to display the last portion of it indicated by an "-". I am using substring-after to do this but this only works if there is one charactor. There are occasions where there might be one and some where there is two. I have seen some recursive templates for this but I have not seen them in a For-each Loop like I have it here and I am not sure where I would put everything in my XSL document.
Here is my XML document:
<?xml version="1.0" encoding="UTF-8"?>
<JobList>
<Job T.number="28" />
<Job T.identifier="10mm Drill" />
<Job oper.jobName="2: T28-Contour Milling - Grind me back" />
<Job T.number="3" />
<Job T.identifier="9mm Drill" />
<Job oper.jobName="3: T3 Contour Milling" />
</JobList>
Here is my XSL Document. I am using XSL 1.0. The result I am looking for is I want this to be displayed as "10mm Drill - Grind me back" not "10mm Drill-Contour Milling - Grind me back" which is what I am getting now using the substring-after function or something with the same result.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="UTF-8" method="xml" />
<xsl:param name="REPORT">joblist</xsl:param>
<xsl:param name="LOCALE">en-GB</xsl:param>
<xsl:param name="FORMAT">html</xsl:param>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Tool Report</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="JobList">
<div style="font-size:;">
<table width="100%" style="margin-bottom:50px;font:bold 10px arial;">
<thead>
<tr>
<th style="text-align:center;font-family:Arial;font-size:13;font:bold 7px arial;">
<xsl:value-of select="#month">
</xsl:value-of>
<span>.</span>
<xsl:value-of select="#day">
</xsl:value-of>
<span>.</span>
<xsl:value-of select="#year">
</xsl:value-of>
</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;font:normal 7px arial;font-size:12px;">
<xsl:value-of select="//Job[position()=1]/#cfg.JOBLISTNAME" />
<span>
</span>
<span>
</span>
</td>
</tr>
</tbody>
<table width="100%" border="1" style="margin-bottom:50px;font:13px arial;">
<thead style="font:19;">
<tr style="font-size:19;">
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
<td style="text-align:center;font-weight:bold;font-size:19;">
</td>
</tr>
</thead>
<tbody style="font-size:19;">
<xsl:for-each select="//Job[not(#T.number=preceding::Job/#T.number)]">
<tr style="font-size:19;">
<td style="font-size:19;">
<xsl:value-of select="#T.number" />
</td>
<td>
</td>
<td style="font-size:19;">
<xsl:value-of select="#T.identifier" />
<xsl:choose>
<xsl:when test="contains(#T.toolComment3, 'GRIND') or contains(#T.toolComment3, 'Grind')">
<xsl:value-of select="#T.toolComment3" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="contains(#T.comment2, 'GRIND') or contains(#T.comment2, 'Grind')">
<xsl:value-of select="#T.comment2" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="contains(#oper.jobName, 'GRIND') or contains(#oper.jobName, 'Grind')">
<xsl:value-of select="substring-after(#oper.jobName, '-')" />
</xsl:when>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</table>
</div>
</xsl:template>
</xsl:stylesheet>
Use a named recursive template to get the last token of the text string.
<xsl:template name="last-token">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="'-'"/>
<xsl:choose>
<xsl:when test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="last-token">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Example of call: http://xsltransform.net/bFWR5Ew
I have this simple template:
<!--Item-->
<xsl:template match="Presentations|TFGWItem">
<tr>
<xsl:apply-templates select="Theme"/>
<xsl:apply-templates select="Name" />
</tr>
<xsl:if test="name()='Presentations'">
<tr>
<td>
<xsl:text> </xsl:text>
</td>
<td>
<xsl:text> </xsl:text>
</td>
</tr>
<tr>
<td>
<xsl:text> </xsl:text>
</td>
<td>
<xsl:text> </xsl:text>
</td>
</tr>
</xsl:if>
</xsl:template>
But the if clause is not processing. Am I doing the if test incorrectly?
Turns out that the test was working. It was just that the empty rows were not getting displayed in the browser.
I had to change it:
<!--Item-->
<xsl:template match="LACItem|Presentations|TFGWItem">
<tr>
<xsl:apply-templates select="Theme"/>
<xsl:apply-templates select="Name" />
</tr>
<xsl:if test="name()='Presentations'">
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</xsl:if>
</xsl:template>
I've been working on a XSL style sheet for a specific SQL query table. I would like to group the results by 'tcode' and sum the values of each of the number columns. Any help would be appreciated.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="h_ind h_year h_code" />
<xsl:variable name="v_warning" select="CustomDeferredReport/title/ds_type" />
<xsl:template match="/">
<HTML>
<BODY>
<TABLE>
<TR valign="top">
<TD style="color:black; font-family: arial; font-size: 14pt; font-weight: bold" width="800">
<xsl:choose>
<xsl:when test="$v_warning = '1'">
<xsl:value-of select="CustomDeferredReport/title/rpt_title" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="CustomDeferredReport/title/rpt_warning" />
</xsl:otherwise>
</xsl:choose>
</TD>
</TR>
</TABLE>
<xsl:choose>
<xsl:when test="$v_warning = 1">
<TABLE>
<TR style="text-decoration: underline; font-family: arial; font-size: 8pt; font-weight: bold">
<BOLD>
<TD width="100">Code</TD>
<TD width="200">Name</TD>
<TD width="100">Beginning Balance</TD>
<TD width="100">Current Activity</TD>
<TD width="100">Other Activity</TD>
<TD width="100">Balance Sheet Only Activity</TD>
<TD width="100">Ending Balance</TD>
</BOLD>
</TR>
<xsl:for-each select='/CustomDeferredReport/temps'>
<TR style="font-family: arial; font-size: 8pt">
<TD><xsl:value-of select='tcode'/></TD>
<TD><xsl:value-of select='tname'/></TD>
<TD align="right"><xsl:value-of select='tbbal'/></TD>
<TD align="right"><xsl:value-of select='tdiff'/></TD>
<TD align="right"><xsl:value-of select='tothd'/></TD>
<TD align="right"><xsl:value-of select='tbsd'/></TD>
<TD align="right"><xsl:value-of select='tebal'/></TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Here you go.
In XSLT there is a very common grouping technique you can use that involves a key and the generate-id() function, it is called muenchian grouping (Google it).
Anyhow, I added a key at the top of your solution called, key_t-code, and then use it several times in the solution. The trick here is when itterating over the for-each loop to only do something, in your case sum the nodes when you encounter the loop the first time, achieved by using the key and the generate-id. Enough said. An example is worth a thousand words. Here you go... oh, I did have to correct your XSLT n a couple of places. Mostly your context was off here and there.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="h_ind h_year h_code" />
<xsl:key name="key_t-code" match="temps" use="tcode"/>
<xsl:variable name="v_warning" select="/CustomDeferredReport/title/ds_type" />
<xsl:template match="/">
<HTML>
<BODY>
<TABLE>
<TR valign="top">
<TD style="color:black; font-family: arial; font-size: 14pt; font-weight: bold" width="800">
<xsl:choose>
<xsl:when test="$v_warning = '1'">
<xsl:value-of select="CustomDeferredReport/title/rpt_title" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="CustomDeferredReport/title/rpt_warning" />
</xsl:otherwise>
</xsl:choose>
</TD>
</TR>
</TABLE>
<xsl:choose>
<xsl:when test="$v_warning = 1">
<TABLE>
<TR style="text-decoration: underline; font-family: arial; font-size: 8pt; font-weight: bold">
<BOLD>
<TD width="100">Code</TD>
<TD width="200">Name</TD>
<TD width="100">Beginning Balance</TD>
<TD width="100">Current Activity</TD>
<TD width="100">Other Activity</TD>
<TD width="100">Balance Sheet Only Activity</TD>
<TD width="100">Ending Balance</TD>
</BOLD>
</TR>
<xsl:for-each select='CustomDeferredReport/temps'>
<xsl:if test="generate-id(key('key_t-code', tcode)[1]) = generate-id(.)">
<TR style="font-family: arial; font-size: 8pt">
<TD><xsl:value-of select='tcode'/></TD>
<TD><xsl:value-of select='tname'/></TD>
<TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tbbal)"/></TD>
<TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tdiff)"/></TD>
<TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tothd)"/></TD>
<TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tbsd)"/></TD>
<TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tebal)"/></TD>
</TR>
</xsl:if>
</xsl:for-each>
</TABLE>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
And the Xml
<?xml version="1.0" encoding="UTF-8"?>
<CustomDeferredReport>
<title>
<ds_type>1</ds_type>
<rpt_title>some title rpt_title</rpt_title>
<rpt_warning>some title rpt_warning</rpt_warning>
</title>
<temps>
<tcode>AAA</tcode>
<tname>Tripel A</tname>
<tbbal>9.99</tbbal>
<tdiff>.24</tdiff>
<tothd>23</tothd>
<tbsd>5.00</tbsd>
<tebal>62</tebal>
</temps>
<temps>
<tcode>AAA</tcode>
<tname>Tripel A</tname>
<tbbal>3.99</tbbal>
<tdiff>1.24</tdiff>
<tothd>2.03</tothd>
<tbsd>50.00</tbsd>
<tebal>63.23</tebal>
</temps>
<temps>
<tcode>AAA</tcode>
<tname>Tripel A</tname>
<tbbal>.99</tbbal>
<tdiff>24</tdiff>
<tothd>2.3</tothd>
<tbsd>500</tbsd>
<tebal>65.23</tebal>
</temps>
<temps>
<tcode>BB</tcode>
<tname>Double B</tname>
<tbbal>2</tbbal>
<tdiff>.24</tdiff>
<tothd>23</tothd>
<tbsd>5.00</tbsd>
<tebal>62</tebal>
</temps>
<temps>
<tcode>BB</tcode>
<tname>Double B</tname>
<tbbal>4</tbbal>
<tdiff>11.24</tdiff>
<tothd>28.03</tothd>
<tbsd>5.23</tbsd>
<tebal>.26</tebal>
</temps>
<temps>
<tcode>BB</tcode>
<tname>Double A</tname>
<tbbal>6</tbbal>
<tdiff>32</tdiff>
<tothd>223</tothd>
<tbsd>6.7</tbsd>
<tebal>12.23</tebal>
</temps>
</CustomDeferredReport>
To run this solution separate of your environment, so to see this run in a browser locally, just add the following deceleration just below the existing xml declaration in your Xml (and to be safe, use my Xml).
<?xml-stylesheet type='text/xsl' href='tcode.xsl'?>
Take the XSLT I have written and save it to disk and name it tcode.xsl. This transformation should work lickity split in IE but if you insist on running it in Chrome, well you have to set a flag that enables local files to run... --allow-file-access-from-files
After adding the xml-stylesheet deceleration to your Xml, drag the Xml into an IE browser and it should transform it.
I have five values that come from a form; like state1, state2, state3, state4, and state5.
Each value can be either 'New' or 'Closed'.
A Report will be displayed based on these values.
So, I created 5 tables, one each to be displayed on the report.
If a value is 'New' then display the respective table else no need to display.
So, I created XSLT like the below (this is just a fragment from my code).
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" omit-xml-declaration="yes" standalone="yes" indent="yes"cdata-section-elements="script msxsl:script"></xsl:output>
<xsl:template match="/">
<html>
<head><title>Report</title></head>
<body>
<table class="row1">
<tr>
<td align="left" colspan="2">
<img src="../images/Logos/logo.gif" height="80"></img>
</td>
</tr>
</table>
<xsl:if test="(state1='New') and (state2='Closed') and (state3='Closed') and (state4='Closed') and (state5='Closed')">
<table class="row2">
<tr>
<td class="section" uniqueID="ms__id17">
<b>Details(S1)</b>
</td>
</tr>
<!--some rows -->
</table>
</xsl:if>
<xsl:if test="(state1='New') and (state2='New') and (state3='Closed') and (state4='Closed') and (state5='Closed')">
<table class="row2">
<tr>
<td class="section" uniqueID="ms__id18">
<b>Details(S1)</b>
</td>
</tr>
<!--some rows -->
</table>
<table class="row3">
<tr>
<td class="section" uniqueID="ms__id19">
<b>Details(S2)</b>
</td>
</tr>
<!--some rows -->
</table>
</xsl:if>
<!--more conditions-->
</body>
</html>
</xsl:template>
</xsl:stylesheet>
If I keep on giving conditions like this I should give 5! conditions.
Is there a better way of doing this.
Is this what you want (use or instead of and)?
<xsl:if test="(state1='New') or (state2='New') or (state3='New') or (state4='New') or (state5='New')">
<table class="row2">
<tr>
<td class="section" uniqueID="ms__id17">
<b>Details(S1)</b>
</td>
</tr>
<!--some rows -->
</table>
</xsl:if>