RE: [xsl] Modes (was RE: [xsl] Re: Keys, IDs lookup tables.)

Subject: RE: [xsl] Modes (was RE: [xsl] Re: Keys, IDs lookup tables.)
From: Michele R Combs <mrrothen@xxxxxxx>
Date: Mon, 11 Jun 2012 16:54:00 +0000
Thanks.  I should have been clearer in my request.  I understand the concept
of modes (what they are for) but have been having difficulty putting them into
execution, and/or untangling them in pre-existing code.  A technical
explanation with examples is more what I'm looking for.

Michele

-----Original Message-----
From: Ihe Onwuka [mailto:ihe.onwuka@xxxxxxxxxxxxxx]
Sent: Monday, June 11, 2012 12:12 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Modes (was RE: [xsl] Re: Keys, IDs lookup tables.)

When you want to process the same node in more than one way.

eg to produce the body of a book, the index and the table of contents, you are
processing the same nodes but doing different things with them.


On Mon, Jun 11, 2012 at 5:01 PM, Michele R Combs <mrrothen@xxxxxxx> wrote:
> I notice that you're using "mode" in this solution.  Can someone point me to
a good explanation of modes, with good examples?  I haven't worked much with
them and am finding them a bit confusing.
>
> Thanks
>
> Michele
>
> 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>&#160;</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>&#160;</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>&#160;</td><td>191115</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Made-up
>>>> filler</td><td>&#160;</td><td>&#160;</td><td>&#160;</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Net Income</td><td>&#160;</td><td>28999</td><td>191203</td>
>>>> </tr>
>>>> </table>
>>>>
>>>> <table border="1">
>>>> <tr>
>>>> <td colspan="4">Barrick Gold</td>
>>>> </tr>
>>>> <tr>
>>>> <td>&#160;</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>&#160;</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Total Assets</td><td>1007827</td><td>1102209</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Pre-Tax Income</td><td>&#160;</td><td>&#160;</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Made-up filler</td><td>&#160;</td><td>&#160;</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Net Income</td><td>&#160;</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