<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.netindonesia.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Incoherent Rambling</title><subtitle type="html">.Net, coding, architecture and life in general</subtitle><id>http://geeks.netindonesia.net/blogs/jimmy/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.netindonesia.net/blogs/jimmy/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-08-12T16:53:00Z</updated><entry><title>Globalization / Localization Strikes Again</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx</id><published>2008-09-28T06:56:31Z</published><updated>2008-09-28T06:56:31Z</updated><content type="html">&lt;p&gt;To assume, as they said it, is to make an &lt;strong&gt;ass&lt;/strong&gt; of &lt;strong&gt;u&lt;/strong&gt; (you) and &lt;strong&gt;me&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;And that&amp;#39;s exactly what happened recently on one of my side projects.&amp;nbsp; I created a stock quote component that will retrieve stock data in form of a CSV from Yahoo! Finance.&lt;/p&gt; &lt;p&gt;Take a look at the following ASP.NET code fragment example:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; numberExtractedFromAnExternalCSV = &lt;span class="str"&gt;&amp;quot;&lt;/span&gt;1834.591&lt;span class="str"&gt;&amp;quot;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;Decimal number = Convert.ToDecimal(numberExtractedFromAnExternalCSV);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;Response.Write(number); &lt;span class="rem"&gt;//expecting 1834.591&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;Response.Write(string.Format(&amp;quot;&lt;/span&gt;{0:N0}&amp;quot;, number));  &lt;span class="rem"&gt;//expecting 1,835&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On a couple computers that I ran this code on, I got what I was expecting.&amp;nbsp; So I assumed that since it did well on the computers that were under my control (and it actually ran correctly on one of the web hosting that we tried), it should run well everywhere. But when the thing is deployed to a different web hosting, I got something totally different.&lt;/p&gt;
&lt;p&gt;The result appeared as 1834591 and when formatted, it became 1.834.591.&lt;/p&gt;
&lt;p&gt;In a smaller font, I didn&amp;#39;t quite realize what was happening since the different between . (period) and , (comma) is not too discernable.&amp;nbsp; All I know was that my number was appearing funny and off compared to the real quote from the actual source.&lt;/p&gt;
&lt;p&gt;I hypothesized that this might be something to do with the string.Format function or rather, I was using StringBuilder.AppendFormat.&amp;nbsp; Perhaps there was some bug or something.&amp;nbsp; From the look of it, the web hosting might be running Linux and executing the web application under Mono.&amp;nbsp; Perhaps its a Mono bug.&lt;/p&gt;
&lt;p&gt;Playing around with some test codes didn&amp;#39;t produce any good conclusion.&amp;nbsp; The test code was as follow:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Decimal number = 1834.591M;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;Response.Write(number); &lt;span class="rem"&gt;//expecting 1834.591&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;Response.Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0:N0}&amp;quot;&lt;/span&gt;, number)); &lt;span class="rem"&gt;//expecting 1835&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which you can imagine produced the expected result (or rather something a bit off, but not too discernable... 1834,591 and 1.835).&amp;nbsp; This was confirmed when the test was deployed to the web hosting.&lt;/p&gt;
&lt;p&gt;After staring at the screen for a while and realizing that the comma and period are in the wrong places, I realized that I am staring at a globalization / localization issue.&amp;nbsp; Apparently the current web hosting is using Indonesian culture (id-ID) in their server Regional and Language Settings, while the web application itself was not associated with any default globalization setting which of course will pick up whatever the machine&amp;#39;s localization was set to.&lt;/p&gt;
&lt;p&gt;Forcing the web application into en-us in the web.config, fixed the issue.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;globalization&lt;/span&gt; &lt;span class="attr"&gt;culture&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;en-US&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;uiCulture&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;en-us&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;One thing that I like to point out is that Decimal.Convert was the culprit and I should have tested the result of that conversion first (1834.591 was converted to 1834591 since the period was ignored in id-ID culture setting).&lt;/p&gt;
&lt;p&gt;Well, that&amp;#39;s the third time globalization / localization has bitten me in the ...&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx&amp;amp;subject=Globalization / Localization Strikes Again" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx&amp;amp;t=Globalization+%2f+Localization+Strikes+Again" target="_blank" title="Submit Globalization / Localization Strikes Again to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx&amp;amp;title=Globalization+%2f+Localization+Strikes+Again" target="_blank" title="Submit Globalization / Localization Strikes Again to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx&amp;amp;phase=2" target="_blank" title="Submit Globalization / Localization Strikes Again to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/28/globalization-localization-strikes-again.aspx&amp;amp;title=Globalization+%2f+Localization+Strikes+Again" target="_blank" title="Add Globalization / Localization Strikes Again to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64477" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term=".NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx" /><category term="Rant" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Rant/default.aspx" /><category term="C#" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Taking Linux For a Spin</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx</id><published>2008-09-26T11:05:47Z</published><updated>2008-09-26T11:05:47Z</updated><content type="html">&lt;p&gt;Was tasked to install Informix on a Linux recently.&amp;nbsp; I&amp;#39;ve never really play around Linux that much.&amp;nbsp; Occassionally, downloaded a distribution like Ubuntu or Mandrake (now Mandriva) and installed them on a VM and just looked around what the OS is about.&amp;nbsp; Also played around with the bourne shell some, so I know some basic Linux commands like ls, cp, rm, cat, ps, grep, more, etc. and how to pipe them up together.&amp;nbsp; Learned some of the Unix related commands on my previous job when I had to play around a little with Sun Solaris, which was like a good 11 years ago.&lt;/p&gt; &lt;p&gt;To my surprise, I found myself intrigued with the OS.&amp;nbsp; Especially with the latest Ubuntu 8.04 (Hardy Heron).&amp;nbsp; It&amp;#39;s a pretty nice OS to use and quite easy compared to something like Red Hat / Fedora distribution.&lt;/p&gt; &lt;p&gt;In trying to make Informix installed correctly on some of the Linux distributions (tried Ubuntu and Fedora), I found myself learning quite a lot about this OS.&amp;nbsp; For example, in Vista / Windows OS,we have the User Account Control and Run As Administrator.&amp;nbsp; It turned out that Linux also has similar thing, such as sudo and su - root.&amp;nbsp; Learned about where web server is installing its root web (var/www), and some other neat stuffs.&lt;/p&gt; &lt;p&gt;So, feeling intrigued, I decided to try it further by installing MySql, and Mono (naturally, being a .NET developer, I just have to see what&amp;#39;s the big deal about Mono).&amp;nbsp; Installed MonoDevelop and started hacking some code to connect it to MySql and query the data.&amp;nbsp; There were some bumps in the road, but overall, I think it&amp;#39;s a good thing that .NET can run on Mono.&amp;nbsp; So far, tried doing generic, database connection stuffs.&amp;nbsp; Haven&amp;#39;t played around Silverlight implementation (Moonlight) yet.&lt;/p&gt; &lt;p&gt;In any case, it was an interesting experience.&amp;nbsp; Would I throw away Windows for it completely?&amp;nbsp; Probably not.&amp;nbsp;&amp;nbsp; I just can&amp;#39;t live without Visual Studio, and Windows Live Writer, yet :).&amp;nbsp; Maybe one day, hehehe.&amp;nbsp; It does make a good alternative if you have a spare computer.&amp;nbsp; I really want to try Beryl?&amp;nbsp; That stuff looks pretty awesome for an eye candy, but just don&amp;#39;t have any machine I can spare for a non VM installation yet.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx&amp;amp;subject=Taking Linux For a Spin" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx&amp;amp;t=Taking+Linux+For+a+Spin" target="_blank" title="Submit Taking Linux For a Spin to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx&amp;amp;title=Taking+Linux+For+a+Spin" target="_blank" title="Submit Taking Linux For a Spin to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx&amp;amp;phase=2" target="_blank" title="Submit Taking Linux For a Spin to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/taking-linux-for-a-spin.aspx&amp;amp;title=Taking+Linux+For+a+Spin" target="_blank" title="Add Taking Linux For a Spin to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64217" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Blab" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Blab/default.aspx" /><category term=".NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx" /><category term="Linux" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Linux/default.aspx" /></entry><entry><title>Look Ma... No Wire!!</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx</id><published>2008-09-26T10:47:45Z</published><updated>2008-09-26T10:47:45Z</updated><content type="html">&lt;p&gt;Finally decided to try wireless networking at home.&amp;nbsp; Bought a Linksys WRT54G2 wireless router for about IDR 570,000 and hooked it up to my home cable modem.&amp;nbsp; After troubleshooting some issue like the router just couldn&amp;#39;t get an IP address from the cable modem and&amp;nbsp; Vista to Vista file sharing problem that stumped me for quite a while,&amp;nbsp; I am a happy wireless networker now :).&amp;nbsp; &lt;/p&gt; &lt;p&gt;Things that I found I enjoy doing on the new home network:&lt;/p&gt; &lt;p&gt;1. Browse the web from anywhere around the house&lt;/p&gt; &lt;p&gt;2. Access and transfer files from my laptop and home PC without needing to copy it to a flashdisk&lt;/p&gt; &lt;p&gt;3. Using my laptop and remote desktop as a remote control to play audio files on my home PC :)&lt;/p&gt; &lt;p&gt;4. Don&amp;#39;t have to wait until my kid is finished playing Baby Smash, Sesame Street games, or whatever until I can use the net :)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Happy Happy Joy Joy!&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx&amp;amp;subject=Look Ma... No Wire!!" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx&amp;amp;t=Look+Ma...+No+Wire!!" target="_blank" title="Submit Look Ma... No Wire!! to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx&amp;amp;title=Look+Ma...+No+Wire!!" target="_blank" title="Submit Look Ma... No Wire!! to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx&amp;amp;phase=2" target="_blank" title="Submit Look Ma... No Wire!! to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/26/look-ma-no-wire.aspx&amp;amp;title=Look+Ma...+No+Wire!!" target="_blank" title="Add Look Ma... No Wire!! to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64214" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Blab" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Blab/default.aspx" /></entry><entry><title>K2 BlackPearl 807 is Out</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx</id><published>2008-09-25T06:37:30Z</published><updated>2008-09-25T06:37:30Z</updated><content type="html">&lt;p&gt;Finally, the long awaited 807 is out of the oven.&amp;nbsp; Downloading it as I type.&amp;nbsp; Quite big this one, 200+ mb.&amp;nbsp; Out of Office is finally making a come back after some hiatus from K2.NET 2003 to BP transition period.&amp;nbsp; Supposedly this version should fix the K2 report problem that has been plaguing the server at my office since upgrading to SP1 version.&amp;nbsp; We&amp;#39;ll have to see later on today.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx&amp;amp;subject=K2 BlackPearl 807 is Out" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx&amp;amp;t=K2+BlackPearl+807+is+Out" target="_blank" title="Submit K2 BlackPearl 807 is Out to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx&amp;amp;title=K2+BlackPearl+807+is+Out" target="_blank" title="Submit K2 BlackPearl 807 is Out to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx&amp;amp;phase=2" target="_blank" title="Submit K2 BlackPearl 807 is Out to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/25/k2-blackpearl-807-is-out.aspx&amp;amp;title=K2+BlackPearl+807+is+Out" target="_blank" title="Add K2 BlackPearl 807 is Out to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63942" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="K2 Blackpearl" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/K2+Blackpearl/default.aspx" /></entry><entry><title>Operation could destabilize the runtime</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx</id><published>2008-09-22T09:00:00Z</published><updated>2008-09-22T09:00:00Z</updated><content type="html">&lt;p&gt;I was trying to reproduce Repository pattern that Rob Conery was using in his MVC Store Front project in my own project.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Continuing with the interface programming style hype, I decided to make everything implement some sort of an interface.&amp;nbsp; So my domain object (say Person), will implement IPerson interface and so on.&lt;/p&gt; &lt;p&gt;So I have an IPersonRepository that will have a couple of implementations.&amp;nbsp; One for testing (TestPersonRepository : IPersonRepository) and a real Linq To Sql implmentation (SqlPersonRepository : IPersonRepository).&lt;/p&gt; &lt;p&gt;The repository has one method, which is IQueryable&amp;lt;IPerson&amp;gt; GetPersons() that will return all the available persons.&lt;/p&gt; &lt;p&gt;My test which was using the TestPersonRepository implementation works well.&amp;nbsp; But when I tried integrating my code using the real Linq to Sql implementation, it blew up. &lt;/p&gt; &lt;p&gt;The code for the SqlPersonRepository implementation is as follow:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;IPerson&amp;gt; GetPersons() &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.Linq.SampleDbContext();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    var query = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Persons&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                    select (IPerson) &lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Person {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                      FirstName = p.FirstName, LastName = p.LastName&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; query;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, I was trying to cast Person to IPerson in the Linq query.&amp;nbsp; This apparently didn&amp;#39;t work. Hehehe.&amp;nbsp; Changing all my interface to IQueryable&amp;lt;Person&amp;gt; and removing the casting will make it work.&lt;/p&gt;
&lt;p&gt;Another work around that I found to work is using the following code:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;IPerson&amp;gt; GetPerson()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.Linq.SampleDbContext();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    var query = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Persons&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                        select p;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    IList&amp;lt;IPerson&amp;gt; results = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;IPerson&amp;gt;();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt;(var p &lt;span class="kwrd"&gt;in&lt;/span&gt; query)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        results.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Person { FirstName = p.FirstName, LastName = p.LastName });&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; results.AsQueryable();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sucks :)&lt;/p&gt;
&lt;p&gt;Anyone want to take a stab at what&amp;#39;s going on here?&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx&amp;amp;subject=Operation could destabilize the runtime" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx&amp;amp;t=Operation+could+destabilize+the+runtime" target="_blank" title="Submit Operation could destabilize the runtime to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx&amp;amp;title=Operation+could+destabilize+the+runtime" target="_blank" title="Submit Operation could destabilize the runtime to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx&amp;amp;phase=2" target="_blank" title="Submit Operation could destabilize the runtime to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/operation-could-destabilize-the-runtime.aspx&amp;amp;title=Operation+could+destabilize+the+runtime" target="_blank" title="Add Operation could destabilize the runtime to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63270" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="SQL" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/SQL/default.aspx" /><category term=".NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx" /><category term="LINQ" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/LINQ/default.aspx" /><category term="Generic" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Generic/default.aspx" /><category term="Anonymous Type" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Anonymous+Type/default.aspx" /></entry><entry><title>Interesting MVC Sample Project</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx</id><published>2008-09-22T08:57:00Z</published><updated>2008-09-22T08:57:00Z</updated><content type="html">&lt;p&gt;I was listening to some podcasts or other, I think it was one of the &lt;a href="http://herdingcode.com/" title="Herding Code Podcast" target="_blank"&gt;Herding Code&lt;/a&gt; podcasts, where they interview Rob Conery and his sample MVC project.&amp;nbsp; In which he walked you through the process of creating this MVC Storefront using ASP.NET MVC, TDD, LINQ, Dependency Injections, etc.&amp;nbsp; The format of it is a webcast that you can download and playback at your own leisure.&lt;/p&gt;
&lt;p&gt;Along the way he consulted other experts in the .NET world such as Ayende Rahien (Oren Eini) of NHibernate and RhinoMock fame, Jon Galloway, etc.&lt;/p&gt;
&lt;p&gt;If you are interested in doing MVC and this type of stuffs, I strongly suggest you take a look at his webcasts.&lt;/p&gt;
&lt;p&gt;You can find the stuff &lt;a href="http://blog.wekeroad.com/mvc-storefront/" title="MVC Storefront" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Rob is also the creator of &lt;a href="http://subsonicproject.com/" title="Subsonic Project" target="_blank"&gt;Subsonic&lt;/a&gt; (data access layer scaffolder / mapper or something for lack of better term).&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx&amp;amp;subject=Interesting MVC Sample Project" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx&amp;amp;t=Interesting+MVC+Sample+Project" target="_blank" title="Submit Interesting MVC Sample Project to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx&amp;amp;title=Interesting+MVC+Sample+Project" target="_blank" title="Submit Interesting MVC Sample Project to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx&amp;amp;phase=2" target="_blank" title="Submit Interesting MVC Sample Project to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/interesting-mvc-sample-project.aspx&amp;amp;title=Interesting+MVC+Sample+Project" target="_blank" title="Add Interesting MVC Sample Project to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63268" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Architecture" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Architecture/default.aspx" /><category term="Video" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Video/default.aspx" /><category term="ASP.NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Reflecting over Software Usability</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx</id><published>2008-09-22T08:53:00Z</published><updated>2008-09-22T08:53:00Z</updated><content type="html">&lt;p&gt;I was entertaining my two and a half year old boy a couple days back.&amp;nbsp; I&amp;#39;m just amazed on how quick kids nowadays can adapt to technology.&amp;nbsp; At that age, he already mastered how to use the mouse to navigate, click and drag and drop stuffs.&lt;/p&gt; &lt;p&gt;Lately he&amp;#39;s been hooked on &lt;a href="http://www.hanselman.com" title="Scott Hanselman&amp;#39;s Blog" target="_blank"&gt;Scott Hanselman&lt;/a&gt;&amp;#39;s &lt;a href="http://www.babysmash.com" title="Baby Smash" target="_blank"&gt;Baby Smash&lt;/a&gt;, &lt;a href="http://www.youtube.com" title="YouTube" target="_blank"&gt;YouTube&lt;/a&gt; kids videos like the &lt;a href="http://www.youtube.com/watch?v=0fw3l1z9CUQ" title="Alphabet song" target="_blank"&gt;Alphabet Song&lt;/a&gt;, etc. and &lt;a href="http://www.sesamestreet.org" title="Sesame Street" target="_blank"&gt;Sesame Street&lt;/a&gt; website which is full of games and activities for kids his age.&lt;/p&gt; &lt;p&gt;I can give him instruction already on how to use most of the stuffs that are on the screen (i.e. go click that red button there, or just drag the lemon to the jug, etc.)&amp;nbsp; and he could execute the instruction just fine.&amp;nbsp; Recently, I don&amp;#39;t even have to tell him how to switch between YouTube videos, etc.&amp;nbsp; He&amp;#39;ll do it by himself.&amp;nbsp; As a matter of fact, he&amp;#39;d push me aside so not to disturb him having fun.&lt;/p&gt; &lt;p&gt;One thing that amazed me recently is that he seems to understand on how to use the environment like Vista without me telling him the stuffs up front.&amp;nbsp; For example, one time we had FireFox running YouTube, Internet Explorer running a JavaScript HTML application that I built for him (bouncing box with numbers that keep changing color and a bunch of stuffs that you can do to the boxes) and a media player running one of his favorite videos.&amp;nbsp; By accident, he discovered that if he hovered near the taskbar, Vista will give you a preview of the application in a thumbnail.&amp;nbsp; As I watched him playing around with the mouse, I simply post a question to him asking if he could find out how to bring up the Sesame Street session (it was minimized at that time) and he instinctly knew that if he did the hover action, he could figure out which application is running Sesame Street and by clicking on it he was able to bring up IE to the front.&lt;/p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e061a750-6059-47d9-9655-a1ef8f53261e" style="margin:0px;padding:0px;display:inline;float:none;"&gt;&lt;a href="http://geeks.netindonesia.net/controlpanel/blogs/$AppPreview8x6.png" title="Example of Application Previewing in Vista" rel="thumbnail"&gt;&lt;img src="http://geeks.netindonesia.net/controlpanel/blogs/$AppPreview15.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Now, I don&amp;#39;t know if this is a testament of the UX brilliance of the Vista team or my kid is just plain smart, lol.&lt;/p&gt; &lt;p&gt;Just thought I share that with you all.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx&amp;amp;subject=Reflecting over Software Usability" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx&amp;amp;t=Reflecting+over+Software+Usability" target="_blank" title="Submit Reflecting over Software Usability to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx&amp;amp;title=Reflecting+over+Software+Usability" target="_blank" title="Submit Reflecting over Software Usability to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx&amp;amp;phase=2" target="_blank" title="Submit Reflecting over Software Usability to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/reflecting-over-software-usability.aspx&amp;amp;title=Reflecting+over+Software+Usability" target="_blank" title="Add Reflecting over Software Usability to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63265" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Design" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Design/default.aspx" /><category term="Vista" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Vista/default.aspx" /></entry><entry><title>Apparently VS 2008 SP 1...</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx</id><published>2008-09-22T08:28:00Z</published><updated>2008-09-22T08:28:00Z</updated><content type="html">&lt;p&gt;Apparently, if you install Visual Studio 2008 Service Pack 1, you don&amp;#39;t need to install .Net Framework 3.5 SP 1 anymore (already included).&amp;nbsp; It also installed .Net Framework 2.0 SP 2 and .Net Framework 30. SP 2... Apparently.&lt;/p&gt; &lt;p&gt;Btw.&amp;nbsp; What&amp;#39;s in the SP2s?&amp;nbsp; Can&amp;#39;t find those online to download separately.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx&amp;amp;subject=Apparently VS 2008 SP 1..." target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx&amp;amp;t=Apparently+VS+2008+SP+1..." target="_blank" title="Submit Apparently VS 2008 SP 1... to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx&amp;amp;title=Apparently+VS+2008+SP+1..." target="_blank" title="Submit Apparently VS 2008 SP 1... to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx&amp;amp;phase=2" target="_blank" title="Submit Apparently VS 2008 SP 1... to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/apparently-vs-2008-sp-1.aspx&amp;amp;title=Apparently+VS+2008+SP+1..." target="_blank" title="Add Apparently VS 2008 SP 1... to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63255" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term=".NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx" /><category term="Visual Studio" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>New Cool Stuffs in Team Foundation Server 2008</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx</id><published>2008-09-22T08:23:00Z</published><updated>2008-09-22T08:23:00Z</updated><content type="html">&lt;p&gt;Installed Team Foundation Server 2008 Workgroup Edition a couple of days back and been playing around with it.&lt;/p&gt; &lt;p&gt;One thing that I like about TFS 2008 is that they revamped the build process so now you can do Continuous Integration (build when you check-in) / Nightly, and other build settings right from inside VSTS / Team Explorer.&amp;nbsp; Awesome!! :)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;subject=New Cool Stuffs in Team Foundation Server 2008" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;t=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;title=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;phase=2" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;title=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Add New Cool Stuffs in Team Foundation Server 2008 to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63253" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="TFS" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/TFS/default.aspx" /></entry><entry><title>Tabular XML Data to Hierachical XML Data Translation with XSLT</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx</id><published>2008-09-22T08:19:00Z</published><updated>2008-09-22T08:19:00Z</updated><content type="html">&lt;p&gt;On &lt;a href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx" title="Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server 2005" target="_blank"&gt;previous post&lt;/a&gt;, we discussed creating a hierarchical XML from tabular data using only T-SQL.&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;On this post, we&amp;#39;ll explore transforming tabular data in XML format to a hierarchical XML format using purely XSLT.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say that we have an XML that is pretty tabular like the one below.&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml-stylesheet&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/xsl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[replace with the real stylesheet filename here].xsl&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Spock&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Command&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Kirk&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Engineering&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Scotty&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Bones&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ensign Disposable&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Nurse Hatchet&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 1. &lt;b&gt;Tabular Star Trek Crew to Station Mapping xml&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;And we want to transform it into something like:&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Command&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Kirk&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Engineering&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Scotty&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Bones&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Nurse Hatchet&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ensign Disposable&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Spock&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 2. &lt;b&gt;Hierachical Star Trek Crew to Station Mapping xml&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can use the following XSLT to do it:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="attr"&gt;xmlns:ms&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:output&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;indent&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;yes&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;&amp;lt;!-- Store unique station names in variable --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;uniqueStations&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;//Mapping[not(Station=preceding-sibling::Mapping/Station)]/Station&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;processStations&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;processStations&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$uniqueStations&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:sort&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;data-type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;currentStationCrews&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;//Mapping[Station=current()]/Crew&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;                &lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$currentStationCrews&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:sort&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;current()&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 3. &lt;b&gt;XSLT Needed for the Transformation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Frankly, I don&amp;#39;t quite like this particular XSLT format since it is quite imperative in style (for each looping), but I couldn&amp;#39;t find a more declarative template matching solution for this.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If anyone know a better solution, let me know.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One part that I like from this particular sample is by adding&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml-stylesheet&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/xsl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[filename].xsl&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;to the xml file like in Fig. 1, you can test the transformation quickly just by invoking the xml file from a browser (Internet Explorer / FireFox will do this nicely).&amp;nbsp; The only thing is that you can&amp;#39;t really see the actual tag on screen.&amp;nbsp; To quickly verify the resulting transformed XML, you can enter the following JavaScript code into the URL bar of your browser:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;BLOCKED SCRIPTalert(document.documentElement.innerHTML)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Giving credit where credit is due... I used &lt;a href="http://aspalliance.com/34" title="Simple XSLT &amp;amp; XPath grouping" target="_blank"&gt;this ASP Alliance article&lt;/a&gt; by &lt;b&gt;Teemu Keiski&lt;/b&gt; as base for this solution.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;subject=Tabular XML Data to Hierachical XML Data Translation with XSLT" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;t=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;title=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;phase=2" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/22/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;title=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Add Tabular XML Data to Hierachical XML Data Translation with XSLT to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63251" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="xml" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/xml/default.aspx" /></entry><entry><title>How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx" /><link rel="enclosure" type="text/plain" length="11055" href="http://geeks.netindonesia.net/blogs/jimmy/attachment/63170.ashx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx</id><published>2008-09-21T16:51:00Z</published><updated>2008-09-21T16:51:00Z</updated><content type="html">&lt;p&gt;In a recent project that I was handling, there was a requirement to have a forum on top of an existing &lt;a href="http://graffiticms.com/" title="Graffiti CMS" target="_blank"&gt;Graffiti CMS&lt;/a&gt;.&amp;nbsp; Instead of building one from scratch I decided to look for an open source .NET forum engine alternative.&amp;nbsp; That&amp;#39;s when I ran into &lt;a href="http://www.yetanotherforum.net" title="Yet Another Forum .NET" target="_blank"&gt;Yet Another Forum.Net&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The task is simple enough.&amp;nbsp; add a forum virtual directory and when someone click a link to http://blah/forum, YAF.NET should work.&lt;/p&gt; &lt;p&gt;After downloading the forum distributable and adding it as a Graffiti CMS virtual directory, some problems start showing up.&lt;/p&gt; &lt;p&gt;You can follow &lt;a href="http://wiki.yetanotherforum.net/embeddedYaf.ashx" title="How to embed YAF.NET in an existing ASP.NET application" target="_blank"&gt;some steps&lt;/a&gt; described in the YAF.NET Installation Steps&amp;nbsp; section in their Wiki to mitigate the problem but it doesn&amp;#39;t get you 100% there.&lt;/p&gt; &lt;p&gt;Playing around with it, I managed to get it to work with the following steps:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;- Get YAF.NET to work as a standalone application (setup db, etc.).&amp;nbsp; If you can get it to work, you are about 90% there.  &lt;/li&gt;&lt;li&gt;- Remove YAF.NET application from IIS Manager  &lt;/li&gt;&lt;li&gt;- Add YAF.NET directory as a virtual directory of Graffiti or copy the entire YAF.NET directory to Graffiti root folder/forum. I.e. if you Graffiti CMS is installed in D:\Graffiti\Web, then copy YAF.NET content to D:\Graffiti\Web\Forum  &lt;/li&gt;&lt;li&gt;- Copy all bin folder contents from YAF.NET directory to Graffiti bin folder  &lt;/li&gt;&lt;li&gt;- Copy yafnet.config and urlrewriter.config to root directory of Graffiti  &lt;/li&gt;&lt;li&gt;- Make sure to rename the web.config in YAF.NET directory back to default.config so it does not run  &lt;/li&gt;&lt;li&gt;- In Graffiti CMS web.config, you need to make some modifications like:  &lt;/li&gt;&lt;li&gt;- copy the configSection from default.config in YAF.NET directory across  &lt;/li&gt;&lt;li&gt;- copy &amp;lt;yafnet ...&amp;gt; and &amp;lt;rewriter ...&amp;gt; from default.config across  &lt;/li&gt;&lt;li&gt;- create a &amp;lt;location path=&amp;quot;forum&amp;quot;&amp;gt; in Graffiti CMS web.config and copy the &amp;lt;system.web&amp;gt;...&amp;lt;/system.web&amp;gt; from default.config into the &amp;lt;location...&amp;gt; tag.  &lt;/li&gt;&lt;li&gt;- Make modification to &amp;lt;pages ...&amp;gt; tag in the newly copied part in the previous step.&amp;nbsp; You need to copy &amp;lt;namespaces&amp;gt; and its content from Graffiti web.config and change &amp;lt;add namespace...&amp;gt; to &amp;lt;remove namespace...&amp;gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That&amp;#39;s it.&amp;nbsp; Test both Graffiti CMS and the newly integrated YAF.NET to make sure they work.&lt;/p&gt; &lt;p&gt;Attached is a sample of the modified Graffiti CMS web.config&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;subject=How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;t=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;title=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;phase=2" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;title=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Add How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63170" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term=".NET" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx" /><category term="Tips" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx" /></entry><entry><title>100% Customized Development Effort vs Customization of Available Solutions</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx</id><published>2008-09-21T16:48:21Z</published><updated>2008-09-21T16:48:21Z</updated><content type="html">&lt;p&gt;Sometimes, and I am also guilty at this as well, we tend to want to develop a fully 100% customized solution from the very beginning, may it be an ASP.NET website or otherwise.&amp;nbsp; After all, what fun is it in trying to customize someone else&amp;#39;s code, right?&amp;nbsp; Sometimes, it&amp;#39;s just because we are not familiar with or don&amp;#39;t have the time to look around / research what&amp;#39;s out there that someone else has already built that might suit our project requirements.&lt;/p&gt; &lt;p&gt;Nowadays, I am of the opinion that spending your time looking around and trying to find out if there is such solution is really worthwhile and could really help you deliver the solution faster.&lt;/p&gt; &lt;p&gt;Of course, even if you do find the solution, you will still need to analyze if you need to further customize it or not.&amp;nbsp; Perhaps the current solution will only cover 80% of your current requirements and you will need to spend time to fill in the 20% gap doing further customizations.&lt;/p&gt; &lt;p&gt;Sometimes such solution package is not too extensible, then you will need to consider what to do about the rest 20%.&amp;nbsp; Do you build an &amp;#39;out-of-bound&amp;#39; customized solution to fill in the gap?&amp;nbsp; Can you hook it up to the lower level implementation of the current solution? i.e. go straight to the database and mess around with it?&amp;nbsp; Those are risks that you will need to spend your time thinking about.&lt;/p&gt; &lt;p&gt;Another consideration that you need to take is how long will it take you and your team to figure out all the extensibility points of the current solution?&amp;nbsp; Will it be longer than if you actually build up your own solution from scratch?&amp;nbsp; In most cases, the answer will be no (time to customize an existing solution will not take longer than building one from scratch).&amp;nbsp; But reflect on this point as well since you might find the answer is contrary to common thinking.&lt;/p&gt; &lt;p&gt;Just rambling on a thought that came into my mind during one of the projects that I&amp;#39;m doing.&amp;nbsp; I hope this can be of use to you.&lt;/p&gt; &lt;p&gt;Happy analyzing :)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;subject=100% Customized Development Effort vs Customization of Available Solutions" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;t=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;title=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;phase=2" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;title=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Add 100% Customized Development Effort vs Customization of Available Solutions to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63169" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Architecture" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Architecture/default.aspx" /><category term="Tips" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx" /><category term="Sharing" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Sharing/default.aspx" /></entry><entry><title>Debugging Adventure Fun Episode eerr... Whatever</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx</id><published>2008-09-21T16:46:27Z</published><updated>2008-09-21T16:46:27Z</updated><content type="html">&lt;p&gt;I was recently asked to debug a legacy Access 97 (YES, Access 97, lol) database frontend application that is connecting to a SQL Server 7 (Yes, SQL Server 7, lol) backend (Like I said... it&amp;#39;s legacy, what do you expect ^_^).&amp;nbsp; To make things worse, I had to debug this through a remote VNC session since the problem is occuring somewhere in Kalimantan and I am in Jakarta.&amp;nbsp; What fun :), ... &lt;strong&gt;NOT&lt;/strong&gt;! Tried debugging it on a local copy that I have (in VM of course, heck, I am not going to install Office 97 stuffs on my main machine, hehehe, although I did this once before when I didn&amp;#39;t know better, hehehe.&amp;nbsp; It did work however - side by side Office 97 and Office 2003 installation, haven&amp;#39;t tried to do it with Office 2007, nor do I want to - btw, you have to do some tweaking here and there, but it worked.&amp;nbsp; Uhm... Sorry for digressing... Back to laptop, as they said it...), but couldn&amp;#39;t reproduce the error no matter what I do.&amp;nbsp; The application ran just fine on the VM.&amp;nbsp; So, the next logical step is to debug it where the problem is actually happening.&lt;/p&gt; &lt;p&gt;Anyhow, the problem presented to me was an error that kept showing up recently that stumped some unknown code module in the system (The error message provided is very generic like &amp;#39;Unable to fullfil your request&amp;#39;, apparently the person who created the application was well versed in security issue, you know... not exposing the internal system error to the client / user, but he forgot to log the real freaking error somewhere else for easy debugging...ARRGH. Oh, btw, if your Access application is hooked up to run some code automatically on load, you can launch it by holding down Shift key and double-clicking the .mdb file to stop the code from running.&amp;nbsp; Sometimes this is necessary to allow you access to the object viewer, etc.&amp;nbsp; Uhm... Back to laptop... (who the heck invented that phrase anyway...)&lt;/p&gt; &lt;p&gt;After setting numerous breakpoints and tracing the code from the startup form up to the point of failure (what a chore... stupid VNC won&amp;#39;t allow me to press F8, argh, so I have to click on the VBA debug menu item one click at the time to step into / through some code).&amp;nbsp; Oh, did I mentioned the sucky connection between Jakarta and our site in Kalimantan (in the middle of nowhere, literally in jungle, mining site)?&amp;nbsp; Yeah, the VNC connection broke down on multiple occassions!! OMG.&amp;nbsp; Speaking of hellish debugging session... Sigh. Ok, enough digressing... Back to laptop...&lt;/p&gt; &lt;p&gt;Erhmm... Where were we... oh yeah, after blah blah blah breakpoint, blah, and so on and what not... sigh... it turned out that the error was caused by a SQL Query that is constructed using string concatenation like:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;&amp;quot;SELECT Field1, Field2 FROM SomeTable &amp;quot;&lt;/span&gt; + _
&lt;span class="str"&gt;&amp;quot;WHERE Timestamp = &amp;#39;&amp;quot;&lt;/span&gt; + FormatMySillyDate(Now()) +&lt;span class="str"&gt;&amp;quot;&amp;#39; &amp;quot;&lt;/span&gt; + _
&lt;span class="str"&gt;&amp;quot;AND some other criteria here (not important)...&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And when the query got shoved to SQL Server through DAO, SQL just said huh? what date are you talking about... that&amp;#39;s not a date!! and gave up.&lt;/p&gt;
&lt;p&gt;Aside from the abysmal lacking of clear exception information available from the error handling routine that made debugging this application a hellish experience (oh and the VNC, and the network, etc. etc.), my gut instinct pointed me that this could be a localization issue.&amp;nbsp; Since it worked perfectly on my VM (couldn&amp;#39;t reproduce the error, remember?), it&amp;#39;s clearly local to this one workstation (and it was confirmed by the operator that the one installed on the other computer is working just fine.)&amp;nbsp; So... after confirming that the formatted date being passed is something like &amp;#39;18-&lt;strong&gt;&lt;font color="#ff0000"&gt;Agust&lt;/font&gt;&lt;/strong&gt;-2008&amp;#39;, next step that I took is take a look at the Regional Settings of the computer and sure enough, it was set to Indonesian localization :).&amp;nbsp; Changing this back to English (United States), fixed the problem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After strongly warning the user about the &amp;quot;danger&amp;quot; of switching Regional Settings unilaterally and forwarded the issue and resolution to the support (help) desk team (just in case, in the future...), I finally could rest in peace, phew... (or if the boss is watching, rest in peace == back to working hard on the gazillions of other projects, simulteneously, and maintenance issues)&amp;nbsp; There goes 2 hours of my life that I&amp;#39;ll never get back.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Moral of the story is... you figure it out. I am beat (mentally) from debugging this... (^_^).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I apologize for rambling too much, but didn&amp;#39;t you read my blog title? Hehehe.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;p.s. Any exaggeration is purely for comical effect and not to be taken seriously.&amp;nbsp; Funnier to read that way... Bah, why am I explaining this... Sigh.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;subject=Debugging Adventure Fun Episode eerr... Whatever" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;t=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;title=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;phase=2" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;title=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Add Debugging Adventure Fun Episode eerr... Whatever to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63168" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Fun" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Fun/default.aspx" /><category term="Rant" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Rant/default.aspx" /><category term="Tips" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx" /></entry><entry><title>Woot! We're Up Again.</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx</id><published>2008-09-21T15:53:00Z</published><updated>2008-09-21T15:53:00Z</updated><content type="html">&lt;p&gt;Apparently there was a database mishaps with the blog that was causing some downtime.&amp;nbsp; I believe some of our community members spent their time volunteering at MS Indonesia and resurrected the database from the ashes. Hehehe.&amp;nbsp; Great job guys.&lt;/p&gt;&lt;p&gt;It seems that I&amp;#39;m missing a couple of latest posts but at this point I&amp;#39;m just glad that most of the blog data were recoverable.&amp;nbsp; It&amp;#39;d be a shame to lost all of them.&lt;/p&gt;&lt;p&gt;Anyhow, recalling back what I wrote from the recovered point.&amp;nbsp; I believe I posted a question regarding where the Indonesian developer commuity stand on agile software development practices.&amp;nbsp; I also posted something regarding how some of Vista GUI designs were very intuitive even for a 2.5 years old kid.&amp;nbsp; And I might have lost a follow up post of my last xml post (the one on August 12th), but couldn&amp;#39;t seem to recall what exactly I was posting about.&amp;nbsp; Might still have a draft of it locally at work.&amp;nbsp; I need to check if I can resurrect those.&lt;/p&gt;&lt;p&gt;Anyhow, now that we&amp;#39;re back in business, let&amp;#39;s start blogging again :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx&amp;amp;subject=Woot! We're Up Again." target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx&amp;amp;t=Woot!+We%27re+Up+Again." target="_blank" title="Submit Woot! We're Up Again. to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx&amp;amp;title=Woot!+We%27re+Up+Again." target="_blank" title="Submit Woot! We're Up Again. to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx&amp;amp;phase=2" target="_blank" title="Submit Woot! We're Up Again. to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/09/21/woot-we-re-up-again.aspx&amp;amp;title=Woot!+We%27re+Up+Again." target="_blank" title="Add Woot! We're Up Again. to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63165" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="Blab" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Blab/default.aspx" /><category term="Live" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Live/default.aspx" /></entry><entry><title>Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005)</title><link rel="alternate" type="text/html" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx" /><id>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx</id><published>2008-08-12T09:53:00Z</published><updated>2008-08-12T09:53:00Z</updated><content type="html">&lt;p&gt;A friend of mine asked me today if there is any easy way to transform a table / query result that is quite tabular like the one in the table below to a hierarchical XML format just by using T-SQL query.&lt;/p&gt; &lt;table cellpadding="5" cellspacing="5"&gt;  &lt;tr&gt; &lt;td&gt;&lt;b&gt;Id&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Product&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Activity&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Product A&lt;/td&gt; &lt;td&gt;Activity A&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2&lt;/td&gt; &lt;td&gt;Product A&lt;/td&gt; &lt;td&gt;Activity B&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;Product B&lt;/td&gt; &lt;td&gt;Activity C&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt;Product C&lt;/td&gt; &lt;td&gt;Activity D&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p style="font-size:0.7em;"&gt;Fig 1.&lt;b&gt; ProductMapping Table&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity D&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 2.&lt;b&gt; Expected XML Result&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Although I dabble in XML, XPATH, XSLT and the like from .NET / JavaScript; I&amp;#39;ve never really touched SQL Server XML features that much so I decided to play around a little with it.&lt;/p&gt;
&lt;p&gt;The only thing I remember about T-SQL and XML is that they have this &lt;b&gt;FOR XML&lt;/b&gt; keyword that will allow you to transform table data to XML ... somehow.&lt;/p&gt;
&lt;p&gt;After a bit of researching and trial and error, I came up with the following T-SQL Query:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;DISTINCT&lt;/span&gt; product &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;desc&lt;/span&gt;&amp;quot;,&lt;/pre&gt;&lt;pre class="alt"&gt;    (&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            activity &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;*&amp;quot;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            ProductMapping m2&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            m2.product = m1.product&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;activity&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;activities&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    ) &lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    ProductMapping m1 &lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;products&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 3.&lt;b&gt; First T-SQL attempt for transforming tabular data to XML&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This gets me pretty close to what I want, but for some reasons the subquery result is HTML encoded.&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity A&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity B&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity C&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity D&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 4.&lt;b&gt; Bad XML!!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After researching a little bit more and could not find a satisfactory and clean answer to do this, I finally just gave up and wrapped the above T-SQL in another SELECT statement with a bunch of replace functions surrounding it to transform all the &lt;b&gt;&amp;amp;lt;&lt;/b&gt; and &lt;b&gt;&amp;amp;gt;&lt;/b&gt; to actual &lt;b&gt;&amp;lt;&lt;/b&gt; and &lt;b&gt;&amp;gt;&lt;/b&gt;. &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    replace(&lt;/pre&gt;&lt;pre class="alt"&gt;    replace(&lt;/pre&gt;&lt;pre&gt;    (&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;DISTINCT&lt;/span&gt; product &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;desc&lt;/span&gt;&amp;quot;,&lt;/pre&gt;&lt;pre class="alt"&gt;            (&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    activity &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;*&amp;quot;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    ProductMapping m2&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                    m2.product = m1.product&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;activity&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;activities&amp;#39;&lt;/span&gt;)) &lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            ProductMapping m1 &lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;products&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    ),&lt;/pre&gt;&lt;pre class="alt"&gt;    N&lt;span class="str"&gt;&amp;#39;&amp;amp;lt;&amp;#39;&lt;/span&gt;, N&lt;span class="str"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;),&lt;/pre&gt;&lt;pre&gt;    N&lt;span class="str"&gt;&amp;#39;&amp;amp;gt;&amp;#39;&lt;/span&gt;, N&lt;span class="str"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Products XML]&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 5.&lt;b&gt; This T-SQL gets me what I want but it&amp;#39;s not really elegant.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anyone know a better T-SQL only way to do this?&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;subject=Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005)" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;t=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;title=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;phase=2" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;title=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Add Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63046" width="1" height="1"&gt;</content><author><name>jimmy</name><uri>http://geeks.netindonesia.net/members/jimmy.aspx</uri></author><category term="SQL" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/SQL/default.aspx" /><category term="xml" scheme="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/xml/default.aspx" /></entry></feed>