Subject: Re: [xsl] Re: Keys, IDs lookup tables. From: daniel whitney <dbf.whitney@xxxxxxxxx> Date: Mon, 11 Jun 2012 11:29:11 -0400 |
Thanks, Wendell. Works great. Dan On Wed, Jun 6, 2012 at 6:04 PM, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote: > Daniel, > > > On 6/6/2012 3:31 PM, daniel whitney wrote: >> >> OK so I came up with a solution for Part 2 of my question. Not sure if >> it's the ideal, but it works: >> >> Would Part 1 have a similar solution? Would I store the "lookup" >> portion in a global variable and just call that again and again? > > > Basically, yes, although you will get closer to your ideal of clarity, grace > and maintainability if you refactor with templates. When doing so, you can > pass parameters to retain context. > > So something like: > > <xsl:template match="financialgroup"> > > <tr> > <td> > <xsl:value-of select="key('legend', @financiallegendcode)"/> > </td> > <xsl:apply-templates select="ancestor::financials/perioddate/period" > mode="period-cell"> > <xsl:with-param name="fgroup" select="."/> > </xsl:apply-templates> > </tr> > </xsl:template> > > ... and to receive the call: > > <xsl:template match="period" mode="period-cell"> > <xsl:param name="fgroup" as="element(financialgroup)"/> > > <xsl:variable name="idBase" select="@id"/> > <td> > <xsl:value-of > select="($fgroup/financial[@periodref=$idBase],'....')[1]"/> > </td> > </xsl:template> > > Obviously the details aren't worked out here, and note also I'm using an > XPath 2.0 idiom to provide the fallback value when the particular > 'financialgroup' element has no 'financial' value for the period. > > This also fixes a bug in your code where every period covered is assigned > all values for all of them (or the first of them, if run as XSLT 1.0). > > I hope this helps, > Wendell > > >> <xsl:template match="financialgroup"> >> <xsl:variable name="currentFinancial" select="financial"/> >> <tr> >> <td><xsl:value-of select="key('legend', @financiallegendcode)"/></td> >> <xsl:for-each select="ancestor::financials/perioddata/period"> >> <xsl:variable name="idBase" select="@id"/> >> <td align="right"> >> <xsl:choose> >> <xsl:when test="$currentFinancial/@periodref=$idBase"> >> <xsl:value-of select="$currentFinancial[@periodref=$idBase]"/> >> </xsl:when> >> <xsl:otherwise> >> <xsl:text>....</xsl:text> >> </xsl:otherwise> >> </xsl:choose> >> </td> >> </xsl:for-each> >> </tr> >> </xsl:template> >> >> >> On Wed, Jun 6, 2012 at 10:41 AM, daniel whitney<dbf.whitney@xxxxxxxxx> >> wrote: >>> >>> Hi I'm having problems trying to figure out how to accomplish this and >>> what the best strategy might be. >>> >>> It's a 2 part problem. The first with keys. The second with ID/IDREF. >>> >>> 1. I have an xml file with a "lookup" table at the top >>> (presentation/financiallegend). I want to output, as html, the >>> "longname" element in a table cell whether it exists in the "data" or >>> not. If it does exist in the data then the following cells will >>> contain the financial data. If it doesn't exist, the following cells >>> would just be empty. My XSL file outputs the rows with financial data >>> correctly, but does not include rows where only the "longname" exists >>> (no financial data). >>> >>> 2. The header row of the table is a row of dates, each with a unique >>> id. The subequent rows are financial data that have to align with the >>> corresponding date id. The financial data include refs to their >>> corresponding date ids, but of course there might be ids without a >>> corresponding idref. So I have no idea how get the columns to align >>> correctly. >>> >>> This is a very basic example. The file itself has dozens of lookup >>> tables (not too many IDs). So I'm wondering how to accomplisth this >>> and what is the best strategy to keep things as clean and simple as >>> possible. >>> >>> Does having a schema contribute to the simplicity of the XSL somehow, >>> in regards to keys? Or are they essentially separate entities? >>> >>> Any help is, of course, greatly appreciated. >>> >>> Thanks, >>> >>> Dan >>> >>> XML file: >>> >>> <?xml version="1.0" encoding="windows-1252"?> >>> <requesteddata> >>> <presentation> >>> <financiallegend> >>> <code>60.00</code> >>> <longname>Revenue - Operating/Total</longname> >>> </financiallegend> >>> <financiallegend> >>> <code>29.00</code> >>> <longname>Total Assets</longname> >>> </financiallegend> >>> <financiallegend> >>> <code>73.00</code> >>> <longname>Pre-Tax Income</longname> >>> </financiallegend> >>> <financiallegend> >>> <code>2.00</code> >>> <longname>Made-up filler</longname> >>> </financiallegend> >>> <financiallegend> >>> <code>82.00</code> >>> <longname>Net Income</longname> >>> </financiallegend> >>> </presentation> >>> <company> >>> <fpid>154</fpid> >>> <legal>High River Gold Mines Ltd.</legal> >>> <financials> >>> <perioddata> >>> <period id="154_2011-12-31_A_A_414785"> >>> <perioddate>2011-12-31</perioddate> >>> <reporttype code="A">As reported</reporttype> >>> </period> >>> <period id="154_2010-12-31_A_R_414804"> >>> <perioddate>2010-12-31</perioddate> >>> <reporttype code="R">Restated</reporttype> >>> </period> >>> <period id="154_2009-12-31_A_A_414700"> >>> <perioddate>2010-12-31</perioddate> >>> <reporttype code="A">As reported</reporttype> >>> </period> >>> </perioddata> >>> <financialdata> >>> <financialgroup financiallegendcode="29.00" legend="Total Assets"> >>> <financial periodref="154_2011-12-31_A_A_414785">1007827</financial> >>> <financial periodref="154_2010-12-31_A_R_414804">1102209</financial> >>> <financial periodref="154_2009-12-31_A_A_414700">209987</financial> >>> </financialgroup> >>> <financialgroup financiallegendcode="73.00" legend="Pre-Tax Income"> >>> <financial periodref="154_2011-12-31_A_A_414785">231673</financial> >>> <financial periodref="154_2009-12-31_A_A_414700">191115</financial> >>> </financialgroup> >>> <financialgroup financiallegendcode="82.00" legend="Net Income"> >>> <financial periodref="154_2010-12-31_A_R_414804">28999</financial> >>> <financial periodref="154_2009-12-31_A_A_414700">191203</financial> >>> </financialgroup> >>> <financialgroup financiallegendcode="60.00" legend="Revenue - >>> Operating/Total"> >>> <financial periodref="154_2011-12-31_A_A_414785">573949</financial> >>> <financial periodref="154_2010-12-31_A_R_414804">529765</financial> >>> <financial periodref="154_2009-12-31_A_A_414700">447635</financial> >>> </financialgroup> >>> </financialdata> >>> </financials> >>> </company> >>> <company> >>> <fpid>11</fpid> >>> <legal>Barrick Gold</legal> >>> <financials> >>> <perioddata> >>> <period id="11_2011-12-31_A_A_1"> >>> <perioddate>2011-12-31</perioddate> >>> <reporttype code="A">As reported</reporttype> >>> </period> >>> <period id="11_2010-12-31_A_A_2"> >>> <perioddate>2010-12-31</perioddate> >>> <reporttype code="A">As reported</reporttype> >>> </period> >>> </perioddata> >>> <financialdata> >>> <financialgroup financiallegendcode="29.00" legend="Total Assets"> >>> <financial periodref="11_2011-12-31_A_A_1">1007827</financial> >>> <financial periodref="11_2010-12-31_A_A_2">1102209</financial> >>> </financialgroup> >>> <financialgroup financiallegendcode="82.00" legend="Net Income"> >>> <financial periodref="11_2010-12-31_A_A_2">191203</financial> >>> </financialgroup> >>> <financialgroup financiallegendcode="60.00" legend="Revenue - >>> Operating/Total"> >>> <financial periodref="11_2011-12-31_A_A_1">573949</financial> >>> </financialgroup> >>> </financialdata> >>> </financials> >>> </company> >>> </requesteddata> >>> >>> >>> XSL file: >>> >>> <?xml version="1.0" encoding="windows-1252"?> >>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >>> version="2.0"> >>> <xsl:output method="html" indent="yes" encoding="windows-1252"/> >>> <xsl:key name="legend" match="longname" use="../code"/> >>> >>> <xsl:template match="requesteddata"> >>> <xsl:for-each select="company"> >>> <table border="1"> >>> <tr> >>> <td colspan="4"> >>> <xsl:value-of select="legal"/> >>> </td> >>> </tr> >>> <xsl:apply-templates select="financials/perioddata"/> >>> <xsl:apply-templates >>> select="financials/financialdata/financialgroup[key('legend', >>> @financiallegendcode)]"/> >>> </table> >>> </xsl:for-each> >>> </xsl:template> >>> >>> <xsl:template match="perioddata"> >>> <tr> >>> <td> </td> >>> <xsl:for-each select="period"> >>> <td> >>> <xsl:value-of select="perioddate"/><xsl:text> - >>> </xsl:text><xsl:value-of select="reporttype"/> >>> </td> >>> </xsl:for-each> >>> </tr> >>> </xsl:template> >>> >>> <xsl:template match="financials/financialdata/financialgroup"> >>> <tr> >>> <td><xsl:value-of select="key('legend', @financiallegendcode)"/></td> >>> <xsl:for-each select="financial"> >>> <td><xsl:value-of select="."/></td> >>> </xsl:for-each> >>> </tr> >>> </xsl:template> >>> >>> <xsl:template name="presentation"/> >>> </xsl:stylesheet> >>> >>> Output HTML example: >>> >>> <table border="1"> >>> <tr> >>> <td colspan="4">High River Gold Mines Ltd.</td> >>> </tr> >>> <tr> >>> <td> </td><td>2011-12-31 - As Reported</td><td>2010-12-31 - >>> Restated</td><td>2009-12-31 - As Reported</td> >>> </tr> >>> <tr> >>> <td>Revenue - >>> Operating/Total</td><td>573949</td><td>529765</td><td>447635</td> >>> </tr> >>> <tr> >>> <td>Total Assets</td><td>1007827</td><td>1102209</td><td>209987</td> >>> </tr> >>> <tr> >>> <td>Pre-Tax Income</td><td>231673</td><td> </td><td>191115</td> >>> </tr> >>> <tr> >>> <td>Made-up filler</td><td> </td><td> </td><td> </td> >>> </tr> >>> <tr> >>> <td>Net Income</td><td> </td><td>28999</td><td>191203</td> >>> </tr> >>> </table> >>> >>> <table border="1"> >>> <tr> >>> <td colspan="4">Barrick Gold</td> >>> </tr> >>> <tr> >>> <td> </td><td>2011-12-31 - As Reported</td><td>2010-12-31 - As >>> Reported</td> >>> </tr> >>> <tr> >>> <td>Revenue - Operating/Total</td><td>573949</td><td> </td> >>> </tr> >>> <tr> >>> <td>Total Assets</td><td>1007827</td><td>1102209</td> >>> </tr> >>> <tr> >>> <td>Pre-Tax Income</td><td> </td><td> </td> >>> </tr> >>> <tr> >>> <td>Made-up filler</td><td> </td><td> </td> >>> </tr> >>> <tr> >>> <td>Net Income</td><td> </td><td>191203</td> >>> </tr> >>> </table> > > > -- > ====================================================================== > Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx > Mulberry Technologies, Inc. http://www.mulberrytech.com > 17 West Jefferson Street Direct Phone: 301/315-9635 > Suite 207 Phone: 301/315-9631 > Rockville, MD 20850 Fax: 301/315-8285 > ---------------------------------------------------------------------- > Mulberry Technologies: A Consultancy Specializing in SGML and XML > ======================================================================
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Re: Keys, IDs lookup tabl, Wendell Piez | Thread | [xsl] how can I use this values, Roelof Wobben |
Re: [xsl] constructing an element w, Syd Bauman | Date | [xsl] Modes (was RE: [xsl] Re: Keys, Michele R Combs |
Month |