|
Subject: RE: [xsl] Common Element Solution (XSL 2.0) From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 22 Mar 2005 22:26:56 -0000 |
My suggestion would be to replace this:
<xsl:for-each-group select="table/column" group-by="@name">
> <xsl:variable name="name" select="@name"/>
> <xsl:if
> test="count(/tables/table/column[@name=$name])=count(/tables/table)">
> <columnName><xsl:value-of select="@name"/></columnName>
> </xsl:if>
> </xsl:for-each-group>
by this:
<xsl:for-each-group select="table/column" group-by="@name">
<xsl:if test="count(current-group())=count(/tables/table)">
<columnName><xsl:value-of
select="current-grouping-key()"/></columnName>
</xsl:if>
</xsl:for-each-group>
You could also move count(/tables/table) outside the loop into a variable.
Note that the algorithm only works if a column name can appear in a table at
most once.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: JBryant@xxxxxxxxx [mailto:JBryant@xxxxxxxxx]
> Sent: 22 March 2005 21:23
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Common Element Solution (XSL 2.0)
>
> This is neither a question nor an answer to someone else's
> question. I had
> to solve a problem today (finding all the common columns in an XML
> representation of a database), and it occurred to me that the
> solution
> might be useful for others. So, I'm posting for the sake of
> future archive
> searchers. For several years (since early 2000), I would
> occasionally need
> an XSL solution and would search the archives for solutions to my
> problems. Now that I use XSL all a lot (was only occasional
> before), I'm
> trying to give back a bit as my understanding grows.
>
> Of course, if anyone does have comments, I welcome input. I'm
> sure I'll
> never stop learning (at least I hope not).
>
> Given this XML file:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <tables>
> <table name="table1">
> <column name="col1"/>
> <column name="col2"/>
> <column name="col3"/>
> <column name="col4"/>
> </table>
> <table name="table2">
> <column name="col1"/>
> <column name="col2"/>
> <column name="col5"/>
> <column name="col6"/>
> </table>
> <table name="table3">
> <column name="col1"/>
> <column name="col2"/>
> <column name="col7"/>
> <column name="col8"/>
> </table>
> </tables>
>
> Find the columns shared by all tables, by column name.
>
> The solution (in XSL 2.0):
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="/">
> <commonColumns>
> <xsl:apply-templates/>
> </commonColumns>
> </xsl:template>
>
> <xsl:template match="tables">
> <xsl:for-each-group select="table/column" group-by="@name">
> <xsl:variable name="name" select="@name"/>
> <xsl:if
> test="count(/tables/table/column[@name=$name])=count(/tables/table)">
> <columnName><xsl:value-of select="@name"/></columnName>
> </xsl:if>
> </xsl:for-each-group>
> </xsl:template>
>
> </xsl:stylesheet>
>
> Produces the following output with Saxon 8:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <commonColumns>
> <columnName>col1</columnName>
> <columnName>col2</columnName>
> </commonColumns>
>
> FWIW
>
> Jay Bryant
> Bryant Communication Services
> (presently consulting at Synergistic Solution Technologies)
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Common Element Solution (XSL , JBryant | Thread | RE: [xsl] Common Element Solution (, JBryant |
| Re: [xsl] "...how a few lines of XQ, David Carlisle | Date | Re: [xsl] undeclared namespace erro, Dan Chandler |
| Month |