|
Subject: [xsl] Common Element Solution (XSL 2.0) From: JBryant@xxxxxxxxx Date: Tue, 22 Mar 2005 15:22:44 -0600 |
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 -> |
|---|---|---|
| Re: [xsl] undeclared namespace erro, Daniel McOrmond | Thread | RE: [xsl] Common Element Solution (, Michael Kay |
| Re: [xsl] Catch ALL | Failed templa, Wendell Piez | Date | Re: [xsl] "...how a few lines of XQ, David Carlisle |
| Month |