XSLT Grouping on one subnode through multiple higher level nodes -


i'm new xslt trying xml file display node set through xslt. using xsl 1.0. xml looks this:

<...>   <entry>     <organizer>       <component>         <observation>           <code displayname="weight" />           <effectivetime value="5/21/2013 12:00:00 am" />           <value value="75" unit="lbs" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="bmi" />           <effectivetime value="5/21/2013 12:00:00 am" />           <value value="14.6" unit="98" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="weight" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="255" unit="lbs" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="bmi" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="49.8" unit="98" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="blood pressure" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="100/76" unit="mm hg" />         </observation>       </component>     </organizer>   </entry> </...> 

what want output this:

<table>   <tr>     <td>5/21/2013</td>     <td>&nbsp;</td>     <td>weight: 75lbs</td>     <td>bmi: 14.6 90</td>   </tr>   <tr>     <td>5/20/2013</td>     <td>blood pressure: 100/76 mm hg</td>     <td>weight: 255lbs</td>     <td>bmi: 49.8 90</td>   </tr> </table> 

basically, group effectivetime (within observation node), , put blood pressure, weight , bmi in subsequent columns. need have blank table cell if particular code displayname not present particular date (see blood pressure not listed first date).

thanks help. i'm picking xslt, it's taking time since there much.

here version of solution using xslt 1.0 ... rather using variable of field names, coded column handling each one.

t:\ftemp>type entries.xml  <entries>   <entry>     <organizer>       <component>         <observation>           <code displayname="weight" />           <effectivetime value="5/21/2013 12:00:00 am" />           <value value="75" unit="lbs" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="bmi" />           <effectivetime value="5/21/2013 12:00:00 am" />           <value value="14.6" unit="98" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="weight" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="255" unit="lbs" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="bmi" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="49.8" unit="98" />         </observation>       </component>     </organizer>   </entry>   <entry>     <organizer>       <component>         <observation>           <code displayname="blood pressure" />           <effectivetime value="5/20/2013 12:00:00 am" />           <value value="100/76" unit="mm hg" />         </observation>       </component>     </organizer>   </entry> </entries> t:\ftemp>call xslt entries.xml entries1.xsl  <table>    <tr>       <td>5/21/2013</td>       <td>&nbsp;</td>       <td>weight: 75 lbs</td>       <td>bmi: 14.6 98</td>    </tr>    <tr>       <td>5/20/2013</td>       <td>blood pressure: 100/76 mm hg</td>       <td>weight: 255 lbs</td>       <td>bmi: 49.8 98</td>    </tr> </table> t:\ftemp>type entries1.xsl  <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform"   version="1.0">  <xsl:output method="html"/>  <xsl:key name="times" match="entry"          use="organizer/component/observation/effectivetime/@value"/>  <xsl:template match="entries">   <!--create table-->   <table>     <!--grouped time-->     <xsl:for-each select="entry[generate-id(.)=   generate-id(key('times',                   organizer/component/observation/effectivetime/@value)[1])]">       <tr>         <!--subset of time-->         <td>           <xsl:value-of select="substring-before(                   organizer/component/observation/effectivetime/@value,' ')"/>         </td>         <!--the fields in order-->         <xsl:variable name="values"            select="key('times',                       organizer/component/observation/effectivetime/@value)/                   organizer/component/observation"/>         <xsl:choose>           <xsl:when test="$values/code[@displayname='blood pressure']">             <td>               <xsl:for-each                 select="$values[code/@displayname='blood pressure']">                 <xsl:value-of            select="concat('blood pressure: ',value/@value,' ',value/@unit)"/>               </xsl:for-each>             </td>           </xsl:when>           <xsl:otherwise><td>&#xa0;</td></xsl:otherwise>         </xsl:choose>         <xsl:choose>           <xsl:when test="$values/code[@displayname='weight']">             <td>               <xsl:for-each                 select="$values[code/@displayname='weight']">                 <xsl:value-of                      select="concat('weight: ',value/@value,' ',value/@unit)"/>               </xsl:for-each>             </td>           </xsl:when>           <xsl:otherwise><td>&#xa0;</td></xsl:otherwise>         </xsl:choose>         <xsl:choose>           <xsl:when test="$values/code[@displayname='bmi']">             <td>               <xsl:for-each                 select="$values[code/@displayname='bmi']">                 <xsl:value-of                    select="concat('bmi: ',value/@value,' ',value/@unit)"/>               </xsl:for-each>             </td>           </xsl:when>           <xsl:otherwise><td>&#xa0;</td></xsl:otherwise>         </xsl:choose>       </tr>     </xsl:for-each>   </table> </xsl:template> </xsl:stylesheet> t:\ftemp>rem done!  

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -