Help with xslt syntax error | | |
Hi Peter,
I get error when processing the stylesheet. It errors here.
<xsl:for-each select="registration[count(.|key('entry',company
[1])=1]">
specifically:
Expression does not return a DOM node.
registration[-->count(.|key('entry',company[1])=1]<--
Ideas?
Thanks,
Chris
"Peter Flynn" <peter.nosp@m.silmaril.ie> wrote in message
news:3n48ajF19agvsU1@individual.net...[color=blue]
> Chris Kettenbach wrote:
>[color=green]
>> Good Morning,
>> Sorry for xposting. Just need a liitle help.
>> I have an xml file that's generated from a database. How do I select
>> distinct values from a field[/color]
>
> XML doesn't have fields -- the database did but this isn't a database any
> more. In XML they're called elements (they've got a lot in common with
> fields but they ain't the same).
>[color=green]
>> in xslt and then loop through the records and
>> produce output.[/color]
>
> It looks like you need to process the information grouped by company name,
> and there's a technique in XSLT 1.0 for doing this called Muenchian
> grouping
> (it won't be needed in XSLT 2 because that has a built-in group-processing
> command, but XSLT 2 is not a Recommendation yet).
>
> Check the XSLT FAQ for "Muenchian" to find examples.
>
> ///Peter
>
> [Group and followup corrected to comp.text.xml]
>[color=green]
>> Example
>>
>> <registrations>
>> <registration>
>> <company>Awesome Printers</company>
>> <first>John</first>
>> <last>Smith</last>
>> </registration>
>> <registration>
>> <company>Awesome Printers</company>
>> <first>Bob</first>
>> <last>Roberts</last>
>> </registration>
>> <registration>
>> <company>Awesome Printers</company>
>> <first>John</first>
>> <last>Johnson</last>
>> </registration>
>> <registration>
>> <company>Other Company</company>
>> <first>Tom</first>
>> <last>Thomas</last>
>> </registration>
>> <registration>
>> <company>Other Company</company>
>> <first>Dan</first>
>> <last>Daniels</last>
>> </registration>
>> </registrations>
>> ++++++++++++++++++++++++++++++++++++++++++++++++
>> I want the out put to be something like this
>>
>> <table>
>> <tr>
>> <td>Company Name</td>
>> <td>Employees</td>
>> </tr>
>> <tr>
>> <td>Awesome Printers</td>
>> <td>John Smith<br/>
>> Bob Roberts<br/>
>> John Johnson<br/></td>
>> </tr>
>> <tr>
>> <td>Other Company</td>
>> <td>Tom Thomas<br/>
>> Dan Daniels<br/></td>
>> </tr>
>> </table>
>>
>> Effectively writing unique company names once and then putting only the
>> employees from that company into the employee table cell.[/color]
>
> If you scrolled down this far then you've been rewarded :-)
>
> The trick is to use lookup keys to test the selected group of elements
> against, in order to pick only the first ocurrence in each group; then
> output the group header at that point; and only then go and process all
> the
> elements in the group to extract the detail from each of them.
>
> The syntax is tricky because it's very compact. It selects all
> registration
> elements, but subjects each of them to the test that [the number of nodes
> in
> the union of (the current node and the first node with the current company
> value returned by the lookup) is equal to 1] -- in effect meaning they are
> one and the same node, ie the first in their company name grouping. You'll
> probably need to read that 3 or 4 times -- it took me a week to grok it.
>
> <?xml version="1.0" encoding="iso-8859-1"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0">
>
> <xsl:output method="html"/>
>
> <xsl:key name="entry" match="registration" use="company"/>
>
> <xsl:template match="/">
> <html>
> <head>
> <title>Registrations</title>
> </head>
> <body>
> <xsl:apply-templates/>
> </body>
> </html>
> </xsl:template>
>
> <xsl:template match="registrations">
> <table>
> <xsl:for-each select="registration[count(.|key('entry',company
> [1])=1]">
> <xsl:sort select="company"/>
> <tr>
> <th valign="top">
> <xsl:value-of select="company"/>
> </th>
> <td valign="top">
> <xsl:for-each select="key('entry',current()/company)">
> <xsl:sort select="last"/>
> <xsl:value-of select="first"/>
> <xsl:text> </xsl:text>
> <xsl:value-of select="last"/>
> <xsl:if test="position()!=last()">
> <br/>
> </xsl:if>
> </xsl:for-each>
> </td>
> </tr>
> </xsl:for-each>
> </table>
> </xsl:template>
>
> </xsl:stylesheet>
>
> ///Peter
>[/color] | | | | re: Help with xslt syntax error
Unbalanced left <--> right parenthenses
"Chris Kettenbach" <info@piasd.net> wrote in message
news:QYednQ7AnYQFcpDeRVn-iQ@giganews.com...[color=blue]
> Hi Peter,
> I get error when processing the stylesheet. It errors here.
>
> <xsl:for-each select="registration[count(.|key('entry',company
> [1])=1]">
>
> specifically:
>
> Expression does not return a DOM node.
> registration[-->count(.|key('entry',company[1])=1]<--
>
> Ideas?
>
>
> Thanks,
> Chris
>
> "Peter Flynn" <peter.nosp@m.silmaril.ie> wrote in message
> news:3n48ajF19agvsU1@individual.net...[color=green]
>> Chris Kettenbach wrote:
>>[color=darkred]
>>> Good Morning,
>>> Sorry for xposting. Just need a liitle help.
>>> I have an xml file that's generated from a database. How do I select
>>> distinct values from a field[/color]
>>
>> XML doesn't have fields -- the database did but this isn't a database any
>> more. In XML they're called elements (they've got a lot in common with
>> fields but they ain't the same).
>>[color=darkred]
>>> in xslt and then loop through the records and
>>> produce output.[/color]
>>
>> It looks like you need to process the information grouped by company
>> name,
>> and there's a technique in XSLT 1.0 for doing this called Muenchian
>> grouping
>> (it won't be needed in XSLT 2 because that has a built-in
>> group-processing
>> command, but XSLT 2 is not a Recommendation yet).
>>
>> Check the XSLT FAQ for "Muenchian" to find examples.
>>
>> ///Peter
>>
>> [Group and followup corrected to comp.text.xml]
>>[color=darkred]
>>> Example
>>>
>>> <registrations>
>>> <registration>
>>> <company>Awesome Printers</company>
>>> <first>John</first>
>>> <last>Smith</last>
>>> </registration>
>>> <registration>
>>> <company>Awesome Printers</company>
>>> <first>Bob</first>
>>> <last>Roberts</last>
>>> </registration>
>>> <registration>
>>> <company>Awesome Printers</company>
>>> <first>John</first>
>>> <last>Johnson</last>
>>> </registration>
>>> <registration>
>>> <company>Other Company</company>
>>> <first>Tom</first>
>>> <last>Thomas</last>
>>> </registration>
>>> <registration>
>>> <company>Other Company</company>
>>> <first>Dan</first>
>>> <last>Daniels</last>
>>> </registration>
>>> </registrations>
>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>> I want the out put to be something like this
>>>
>>> <table>
>>> <tr>
>>> <td>Company Name</td>
>>> <td>Employees</td>
>>> </tr>
>>> <tr>
>>> <td>Awesome Printers</td>
>>> <td>John Smith<br/>
>>> Bob Roberts<br/>
>>> John Johnson<br/></td>
>>> </tr>
>>> <tr>
>>> <td>Other Company</td>
>>> <td>Tom Thomas<br/>
>>> Dan Daniels<br/></td>
>>> </tr>
>>> </table>
>>>
>>> Effectively writing unique company names once and then putting only the
>>> employees from that company into the employee table cell.[/color]
>>
>> If you scrolled down this far then you've been rewarded :-)
>>
>> The trick is to use lookup keys to test the selected group of elements
>> against, in order to pick only the first ocurrence in each group; then
>> output the group header at that point; and only then go and process all
>> the
>> elements in the group to extract the detail from each of them.
>>
>> The syntax is tricky because it's very compact. It selects all
>> registration
>> elements, but subjects each of them to the test that [the number of nodes
>> in
>> the union of (the current node and the first node with the current
>> company
>> value returned by the lookup) is equal to 1] -- in effect meaning they
>> are
>> one and the same node, ie the first in their company name grouping.
>> You'll
>> probably need to read that 3 or 4 times -- it took me a week to grok it.
>>
>> <?xml version="1.0" encoding="iso-8859-1"?>
>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> version="1.0">
>>
>> <xsl:output method="html"/>
>>
>> <xsl:key name="entry" match="registration" use="company"/>
>>
>> <xsl:template match="/">
>> <html>
>> <head>
>> <title>Registrations</title>
>> </head>
>> <body>
>> <xsl:apply-templates/>
>> </body>
>> </html>
>> </xsl:template>
>>
>> <xsl:template match="registrations">
>> <table>
>> <xsl:for-each select="registration[count(.|key('entry',company
>> [1])=1]">
>> <xsl:sort select="company"/>
>> <tr>
>> <th valign="top">
>> <xsl:value-of select="company"/>
>> </th>
>> <td valign="top">
>> <xsl:for-each select="key('entry',current()/company)">
>> <xsl:sort select="last"/>
>> <xsl:value-of select="first"/>
>> <xsl:text> </xsl:text>
>> <xsl:value-of select="last"/>
>> <xsl:if test="position()!=last()">
>> <br/>
>> </xsl:if>
>> </xsl:for-each>
>> </td>
>> </tr>
>> </xsl:for-each>
>> </table>
>> </xsl:template>
>>
>> </xsl:stylesheet>
>>
>> ///Peter
>>[/color]
>
>
>[/color] | | | | re: Help with xslt syntax error
Do you have an example of how it should look?
Thanks for your help.
Chris
"Dimitre Novatchev" <dimitren@tpg.com.au> wrote in message
news:430e1bdc$0$80641$892e7fe2@authen.white.readfr eenews.net...[color=blue]
> Unbalanced left <--> right parenthenses
>
>
>
> "Chris Kettenbach" <info@piasd.net> wrote in message
> news:QYednQ7AnYQFcpDeRVn-iQ@giganews.com...[color=green]
>> Hi Peter,
>> I get error when processing the stylesheet. It errors here.
>>
>> <xsl:for-each select="registration[count(.|key('entry',company
>> [1])=1]">
>>
>> specifically:
>>
>> Expression does not return a DOM node.
>> registration[-->count(.|key('entry',company[1])=1]<--
>>
>> Ideas?
>>
>>
>> Thanks,
>> Chris
>>
>> "Peter Flynn" <peter.nosp@m.silmaril.ie> wrote in message
>> news:3n48ajF19agvsU1@individual.net...[color=darkred]
>>> Chris Kettenbach wrote:
>>>
>>>> Good Morning,
>>>> Sorry for xposting. Just need a liitle help.
>>>> I have an xml file that's generated from a database. How do I select
>>>> distinct values from a field
>>>
>>> XML doesn't have fields -- the database did but this isn't a database
>>> any
>>> more. In XML they're called elements (they've got a lot in common with
>>> fields but they ain't the same).
>>>
>>>> in xslt and then loop through the records and
>>>> produce output.
>>>
>>> It looks like you need to process the information grouped by company
>>> name,
>>> and there's a technique in XSLT 1.0 for doing this called Muenchian
>>> grouping
>>> (it won't be needed in XSLT 2 because that has a built-in
>>> group-processing
>>> command, but XSLT 2 is not a Recommendation yet).
>>>
>>> Check the XSLT FAQ for "Muenchian" to find examples.
>>>
>>> ///Peter
>>>
>>> [Group and followup corrected to comp.text.xml]
>>>
>>>> Example
>>>>
>>>> <registrations>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>John</first>
>>>> <last>Smith</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>Bob</first>
>>>> <last>Roberts</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>John</first>
>>>> <last>Johnson</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Other Company</company>
>>>> <first>Tom</first>
>>>> <last>Thomas</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Other Company</company>
>>>> <first>Dan</first>
>>>> <last>Daniels</last>
>>>> </registration>
>>>> </registrations>
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>>> I want the out put to be something like this
>>>>
>>>> <table>
>>>> <tr>
>>>> <td>Company Name</td>
>>>> <td>Employees</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Awesome Printers</td>
>>>> <td>John Smith<br/>
>>>> Bob Roberts<br/>
>>>> John Johnson<br/></td>
>>>> </tr>
>>>> <tr>
>>>> <td>Other Company</td>
>>>> <td>Tom Thomas<br/>
>>>> Dan Daniels<br/></td>
>>>> </tr>
>>>> </table>
>>>>
>>>> Effectively writing unique company names once and then putting only the
>>>> employees from that company into the employee table cell.
>>>
>>> If you scrolled down this far then you've been rewarded :-)
>>>
>>> The trick is to use lookup keys to test the selected group of elements
>>> against, in order to pick only the first ocurrence in each group; then
>>> output the group header at that point; and only then go and process all
>>> the
>>> elements in the group to extract the detail from each of them.
>>>
>>> The syntax is tricky because it's very compact. It selects all
>>> registration
>>> elements, but subjects each of them to the test that [the number of
>>> nodes
>>> in
>>> the union of (the current node and the first node with the current
>>> company
>>> value returned by the lookup) is equal to 1] -- in effect meaning they
>>> are
>>> one and the same node, ie the first in their company name grouping.
>>> You'll
>>> probably need to read that 3 or 4 times -- it took me a week to grok it.
>>>
>>> <?xml version="1.0" encoding="iso-8859-1"?>
>>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>>
>>> <xsl:output method="html"/>
>>>
>>> <xsl:key name="entry" match="registration" use="company"/>
>>>
>>> <xsl:template match="/">
>>> <html>
>>> <head>
>>> <title>Registrations</title>
>>> </head>
>>> <body>
>>> <xsl:apply-templates/>
>>> </body>
>>> </html>
>>> </xsl:template>
>>>
>>> <xsl:template match="registrations">
>>> <table>
>>> <xsl:for-each select="registration[count(.|key('entry',company
>>> [1])=1]">
>>> <xsl:sort select="company"/>
>>> <tr>
>>> <th valign="top">
>>> <xsl:value-of select="company"/>
>>> </th>
>>> <td valign="top">
>>> <xsl:for-each select="key('entry',current()/company)">
>>> <xsl:sort select="last"/>
>>> <xsl:value-of select="first"/>
>>> <xsl:text> </xsl:text>
>>> <xsl:value-of select="last"/>
>>> <xsl:if test="position()!=last()">
>>> <br/>
>>> </xsl:if>
>>> </xsl:for-each>
>>> </td>
>>> </tr>
>>> </xsl:for-each>
>>> </table>
>>> </xsl:template>
>>>
>>> </xsl:stylesheet>
>>>
>>> ///Peter
>>>[/color]
>>
>>
>>[/color]
>
>[/color] | | | | re: Help with xslt syntax error
"Chris Kettenbach" <info@piasd.net> wrote in message
news:8_mdnWIPV_ixgJPeRVn-3A@giganews.com...[color=blue]
> Do you have an example of how it should look?
> Thanks for your help.
> Chris[/color]
I am not a compiler, but I have developed a tool that may help -- use the
XPath Visualizer to play with XPath and learn it the fun way.
Cheers,
Dimitre Novatchev
P.S. By not answering your question and directing you to serious
self-training with the XPath Visualizer I am actually saving you a lot of
time -- just try it and you'll see :o)
[color=blue]
>
>
> "Dimitre Novatchev" <dimitren@tpg.com.au> wrote in message
> news:430e1bdc$0$80641$892e7fe2@authen.white.readfr eenews.net...[color=green]
>> Unbalanced left <--> right parenthenses
>>
>>
>>
>> "Chris Kettenbach" <info@piasd.net> wrote in message
>> news:QYednQ7AnYQFcpDeRVn-iQ@giganews.com...[color=darkred]
>>> Hi Peter,
>>> I get error when processing the stylesheet. It errors here.
>>>
>>> <xsl:for-each select="registration[count(.|key('entry',company
>>> [1])=1]">
>>>
>>> specifically:
>>>
>>> Expression does not return a DOM node.
>>> registration[-->count(.|key('entry',company[1])=1]<--
>>>
>>> Ideas?
>>>
>>>
>>> Thanks,
>>> Chris
>>>
>>> "Peter Flynn" <peter.nosp@m.silmaril.ie> wrote in message
>>> news:3n48ajF19agvsU1@individual.net...
>>>> Chris Kettenbach wrote:
>>>>
>>>>> Good Morning,
>>>>> Sorry for xposting. Just need a liitle help.
>>>>> I have an xml file that's generated from a database. How do I select
>>>>> distinct values from a field
>>>>
>>>> XML doesn't have fields -- the database did but this isn't a database
>>>> any
>>>> more. In XML they're called elements (they've got a lot in common with
>>>> fields but they ain't the same).
>>>>
>>>>> in xslt and then loop through the records and
>>>>> produce output.
>>>>
>>>> It looks like you need to process the information grouped by company
>>>> name,
>>>> and there's a technique in XSLT 1.0 for doing this called Muenchian
>>>> grouping
>>>> (it won't be needed in XSLT 2 because that has a built-in
>>>> group-processing
>>>> command, but XSLT 2 is not a Recommendation yet).
>>>>
>>>> Check the XSLT FAQ for "Muenchian" to find examples.
>>>>
>>>> ///Peter
>>>>
>>>> [Group and followup corrected to comp.text.xml]
>>>>
>>>>> Example
>>>>>
>>>>> <registrations>
>>>>> <registration>
>>>>> <company>Awesome Printers</company>
>>>>> <first>John</first>
>>>>> <last>Smith</last>
>>>>> </registration>
>>>>> <registration>
>>>>> <company>Awesome Printers</company>
>>>>> <first>Bob</first>
>>>>> <last>Roberts</last>
>>>>> </registration>
>>>>> <registration>
>>>>> <company>Awesome Printers</company>
>>>>> <first>John</first>
>>>>> <last>Johnson</last>
>>>>> </registration>
>>>>> <registration>
>>>>> <company>Other Company</company>
>>>>> <first>Tom</first>
>>>>> <last>Thomas</last>
>>>>> </registration>
>>>>> <registration>
>>>>> <company>Other Company</company>
>>>>> <first>Dan</first>
>>>>> <last>Daniels</last>
>>>>> </registration>
>>>>> </registrations>
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>>>> I want the out put to be something like this
>>>>>
>>>>> <table>
>>>>> <tr>
>>>>> <td>Company Name</td>
>>>>> <td>Employees</td>
>>>>> </tr>
>>>>> <tr>
>>>>> <td>Awesome Printers</td>
>>>>> <td>John Smith<br/>
>>>>> Bob Roberts<br/>
>>>>> John Johnson<br/></td>
>>>>> </tr>
>>>>> <tr>
>>>>> <td>Other Company</td>
>>>>> <td>Tom Thomas<br/>
>>>>> Dan Daniels<br/></td>
>>>>> </tr>
>>>>> </table>
>>>>>
>>>>> Effectively writing unique company names once and then putting only
>>>>> the
>>>>> employees from that company into the employee table cell.
>>>>
>>>> If you scrolled down this far then you've been rewarded :-)
>>>>
>>>> The trick is to use lookup keys to test the selected group of elements
>>>> against, in order to pick only the first ocurrence in each group; then
>>>> output the group header at that point; and only then go and process all
>>>> the
>>>> elements in the group to extract the detail from each of them.
>>>>
>>>> The syntax is tricky because it's very compact. It selects all
>>>> registration
>>>> elements, but subjects each of them to the test that [the number of
>>>> nodes
>>>> in
>>>> the union of (the current node and the first node with the current
>>>> company
>>>> value returned by the lookup) is equal to 1] -- in effect meaning they
>>>> are
>>>> one and the same node, ie the first in their company name grouping.
>>>> You'll
>>>> probably need to read that 3 or 4 times -- it took me a week to grok
>>>> it.
>>>>
>>>> <?xml version="1.0" encoding="iso-8859-1"?>
>>>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>>> version="1.0">
>>>>
>>>> <xsl:output method="html"/>
>>>>
>>>> <xsl:key name="entry" match="registration" use="company"/>
>>>>
>>>> <xsl:template match="/">
>>>> <html>
>>>> <head>
>>>> <title>Registrations</title>
>>>> </head>
>>>> <body>
>>>> <xsl:apply-templates/>
>>>> </body>
>>>> </html>
>>>> </xsl:template>
>>>>
>>>> <xsl:template match="registrations">
>>>> <table>
>>>> <xsl:for-each select="registration[count(.|key('entry',company
>>>> [1])=1]">
>>>> <xsl:sort select="company"/>
>>>> <tr>
>>>> <th valign="top">
>>>> <xsl:value-of select="company"/>
>>>> </th>
>>>> <td valign="top">
>>>> <xsl:for-each select="key('entry',current()/company)">
>>>> <xsl:sort select="last"/>
>>>> <xsl:value-of select="first"/>
>>>> <xsl:text> </xsl:text>
>>>> <xsl:value-of select="last"/>
>>>> <xsl:if test="position()!=last()">
>>>> <br/>
>>>> </xsl:if>
>>>> </xsl:for-each>
>>>> </td>
>>>> </tr>
>>>> </xsl:for-each>
>>>> </table>
>>>> </xsl:template>
>>>>
>>>> </xsl:stylesheet>
>>>>
>>>> ///Peter
>>>>
>>>
>>>
>>>[/color]
>>
>>[/color]
>
>[/color] | | | | re: Help with xslt syntax error
Dimitre Novatchev wrote:
[color=blue]
> Unbalanced left <--> right parenthenses[/color]
Quite right, it looks like something chewed off the closing parenthesis.
I pasted the code from the working file, so it may have been garbled in
transmission. The line should read
<xsl:for-each select="registration[count(.|key('entry',company)[1])=1]">
(that too is cut'n'paste so if that gets screwed, I'm sorry).
///Peter
[color=blue]
>
>
> "Chris Kettenbach" <info@piasd.net> wrote in message
> news:QYednQ7AnYQFcpDeRVn-iQ@giganews.com...[color=green]
>> Hi Peter,
>> I get error when processing the stylesheet. It errors here.
>>
>> <xsl:for-each select="registration[count(.|key('entry',company
>> [1])=1]">
>>
>> specifically:
>>
>> Expression does not return a DOM node.
>> registration[-->count(.|key('entry',company[1])=1]<--
>>
>> Ideas?
>>
>>
>> Thanks,
>> Chris
>>
>> "Peter Flynn" <peter.nosp@m.silmaril.ie> wrote in message
>> news:3n48ajF19agvsU1@individual.net...[color=darkred]
>>> Chris Kettenbach wrote:
>>>
>>>> Good Morning,
>>>> Sorry for xposting. Just need a liitle help.
>>>> I have an xml file that's generated from a database. How do I select
>>>> distinct values from a field
>>>
>>> XML doesn't have fields -- the database did but this isn't a database
>>> any more. In XML they're called elements (they've got a lot in common
>>> with fields but they ain't the same).
>>>
>>>> in xslt and then loop through the records and
>>>> produce output.
>>>
>>> It looks like you need to process the information grouped by company
>>> name,
>>> and there's a technique in XSLT 1.0 for doing this called Muenchian
>>> grouping
>>> (it won't be needed in XSLT 2 because that has a built-in
>>> group-processing
>>> command, but XSLT 2 is not a Recommendation yet).
>>>
>>> Check the XSLT FAQ for "Muenchian" to find examples.
>>>
>>> ///Peter
>>>
>>> [Group and followup corrected to comp.text.xml]
>>>
>>>> Example
>>>>
>>>> <registrations>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>John</first>
>>>> <last>Smith</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>Bob</first>
>>>> <last>Roberts</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Awesome Printers</company>
>>>> <first>John</first>
>>>> <last>Johnson</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Other Company</company>
>>>> <first>Tom</first>
>>>> <last>Thomas</last>
>>>> </registration>
>>>> <registration>
>>>> <company>Other Company</company>
>>>> <first>Dan</first>
>>>> <last>Daniels</last>
>>>> </registration>
>>>> </registrations>
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>>> I want the out put to be something like this
>>>>
>>>> <table>
>>>> <tr>
>>>> <td>Company Name</td>
>>>> <td>Employees</td>
>>>> </tr>
>>>> <tr>
>>>> <td>Awesome Printers</td>
>>>> <td>John Smith<br/>
>>>> Bob Roberts<br/>
>>>> John Johnson<br/></td>
>>>> </tr>
>>>> <tr>
>>>> <td>Other Company</td>
>>>> <td>Tom Thomas<br/>
>>>> Dan Daniels<br/></td>
>>>> </tr>
>>>> </table>
>>>>
>>>> Effectively writing unique company names once and then putting only the
>>>> employees from that company into the employee table cell.
>>>
>>> If you scrolled down this far then you've been rewarded :-)
>>>
>>> The trick is to use lookup keys to test the selected group of elements
>>> against, in order to pick only the first ocurrence in each group; then
>>> output the group header at that point; and only then go and process all
>>> the
>>> elements in the group to extract the detail from each of them.
>>>
>>> The syntax is tricky because it's very compact. It selects all
>>> registration
>>> elements, but subjects each of them to the test that [the number of
>>> nodes in
>>> the union of (the current node and the first node with the current
>>> company
>>> value returned by the lookup) is equal to 1] -- in effect meaning they
>>> are
>>> one and the same node, ie the first in their company name grouping.
>>> You'll
>>> probably need to read that 3 or 4 times -- it took me a week to grok it.
>>>
>>> <?xml version="1.0" encoding="iso-8859-1"?>
>>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>>
>>> <xsl:output method="html"/>
>>>
>>> <xsl:key name="entry" match="registration" use="company"/>
>>>
>>> <xsl:template match="/">
>>> <html>
>>> <head>
>>> <title>Registrations</title>
>>> </head>
>>> <body>
>>> <xsl:apply-templates/>
>>> </body>
>>> </html>
>>> </xsl:template>
>>>
>>> <xsl:template match="registrations">
>>> <table>
>>> <xsl:for-each select="registration[count(.|key('entry',company
>>> [1])=1]">
>>> <xsl:sort select="company"/>
>>> <tr>
>>> <th valign="top">
>>> <xsl:value-of select="company"/>
>>> </th>
>>> <td valign="top">
>>> <xsl:for-each select="key('entry',current()/company)">
>>> <xsl:sort select="last"/>
>>> <xsl:value-of select="first"/>
>>> <xsl:text> </xsl:text>
>>> <xsl:value-of select="last"/>
>>> <xsl:if test="position()!=last()">
>>> <br/>
>>> </xsl:if>
>>> </xsl:for-each>
>>> </td>
>>> </tr>
>>> </xsl:for-each>
>>> </table>
>>> </xsl:template>
>>>
>>> </xsl:stylesheet>
>>>
>>> ///Peter
>>>[/color]
>>
>>
>>[/color][/color] |  | Similar .NET Framework bytes | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,546 network members.
|