Jump to content

A tricky XSLT Transformation

boetke's Photo
Posted Jan 17 2010 04:50 PM
2278 Views

Hi all,

I have an XSLT transformation that I can't seem to figure out. The original xml:

<DataSet ID="-5480"> 
    <ObsGroup> 
        <ClsItem name="AGE">2099</ClsItem> 
        <ClsItem name="MARITAL_STATUS">3</ClsItem> 
        <ParItem name="UNEMPLOYMENT_RATE">23.34</ParItem> 
        <ParItem name="LABFORCE_FULL_TIME">2292.7071594375</ParItem> 
        <TimeItem name="TIME_CODE">2447</TimeItem> 
    </ObsGroup> 
    <ObsGroup> 
        <ClsItem name="AGE">2099</ClsItem> 
        <ClsItem name="MARITAL_STATUS">3</ClsItem> 
        <ParItem name="UNEMPLOYMENT_RATE">23.66</ParItem> 
        <ParItem name="LABFORCE_FULL_TIME">2300.72108466884</ParItem> 
        <TimeItem name="TIME_CODE">2451</TimeItem> 
    </ObsGroup> 
    <ObsGroup> 
        <ClsItem name="AGE">2099</ClsItem> 
        <ClsItem name="MARITAL_STATUS">4</ClsItem> 
        <ParItem name="UNEMPLOYMENT_RATE">23.77</ParItem> 
        <ParItem name="LABFORCE_FULL_TIME">2353.4791599122</ParItem> 
        <TimeItem name="TIME_CODE">2447</TimeItem> 
    </ObsGroup> 
    <ObsGroup> 
        <ClsItem name="AGE">2099</ClsItem> 
        <ClsItem name="MARITAL_STATUS">4</ClsItem> 
        <ParItem name="UNEMPLOYMENT_RATE">23.88</ParItem> 
        <ParItem name="LABFORCE_FULL_TIME">2335.71727933868</ParItem> 
        <TimeItem name="TIME_CODE">2451</TimeItem> 
    </ObsGroup> 
</DataSet>


The desired output:

<DataSet> 
        <Series> 
            <SeriesKey>     
                <Value concept="MEASURES" value="UNEMPLOYMENT_RATE"/> 
                <Value concept="AGE" value="2099"/>                
                <Value concept="MARITAL_STATUS" value="3"/> 
            </SeriesKey> 
            <Obs> 
                <Time>2447</Time> 
                <ObsValue value="23.34"/> 
            </Obs> 
            <Obs> 
                <Time>2451</Time> 
                <ObsValue value="23.66"/> 
            </Obs> 
        </Series> 
        <Series> 
            <SeriesKey> 
                <Value concept="MEASURES" value="LABFORCE_FULL_TIME"/> 
                <Value concept="AGE" value="2099"/> 
                <Value concept="MARITAL_STATUS" value="3"/> 
            </SeriesKey> 
            <Obs> 
                <Time>2477</Time> 
                <ObsValue value="2292.7071594375"/> 
            </Obs> 
            <Obs> 
                <Time>2451</Time> 
                <ObsValue value="2300.72108466884"/> 
            </Obs> 
        </Series> 
        <Series> 
            <SeriesKey> 
                <Value concept="MEASURES" value="UNEMPLOYMENT_RATE"/> 
                <Value concept="AGE" value="2099"/>                
                <Value concept="MARITAL_STATUS" value="4"/> 
            </SeriesKey> 
            <Obs> 
                <Time>2447</Time> 
                <ObsValue value="23.77"/> 
            </Obs> 
            <Obs> 
                <Time>2451</Time> 
                <ObsValue value="23.88"/> 
            </Obs> 
        </Series>         
        <Series> 
            <SeriesKey> 
                <Value concept="MEASURES" value="LABFORCE_FULL_TIME"/> 
                <Value concept="AGE" value="2099"/>             
                <Value concept="MARITAL_STATUS" value="4"/> 
            </SeriesKey> 
            <Obs> 
                <Time>2447</Time> 
                <ObsValue value="2353.4791599122"/> 
            </Obs> 
            <Obs> 
                <Time>2451</Time> 
                <ObsValue value="2335.71727933868"/> 
            </Obs> 
        </Series> 
    </DataSet> 


I have tried several different methods, in particular the muenchian method of grouping but I don't really understand how I can use several of the same type to group by.

The general concept is: For each group of ClsItem's with the same value, and for each ParItem pertaining to that group, list all observations of that paritem (using time as the series). I can add more info if required.

Tags:
1 Subscribe


1 Reply

0
  Infant Programmer's Photo
Posted Feb 07 2010 10:48 PM

I have worked on a (almost)similar example before and Muenchian method is all fine for this case .. :rolleyes:
use this condition ..
ObsGroup[not(ClsItem[@name='MARITAL_STATUS']=preceding-sibling::ObsGroup/ClsItem[@name='MARITAL_STATUS'])]


I can post you the 100% working XSLT code directly .. but I want you to design it by yourself .. (there by, you so as to get satisfaction of work ..) ;-) ;)

Just try it out .. Otherwise I am here to help you .. :)
Infant Pro,
India.