RE: [xsl] Joining xml documents on the fly

Subject: RE: [xsl] Joining xml documents on the fly
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 4 Jun 2009 16:22:03 +0100
If $staff is all the <staff> elements in the staff file, and $psr is all the
<project_staff_role> elements, then the $staff who are not in the selected
project are:

$staff[not(@staff_id = $psr[@project_id=$pid]/staff/@staff_id)]

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 
 

> -----Original Message-----
> From: Joelle Tegwen [mailto:tegwe002@xxxxxxx] 
> Sent: 04 June 2009 16:12
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Joining xml documents on the fly
> 
> Ah! Yes. it is there for a reason. I tried what you did 
> thinking "Oh, this is so simple." But it is not that way, 
> because I need to include
> *all* of the staff, even those that have not yet been added 
> to projects. 
> So there is Jason Altman, he is not in the 
> project_staff_roles document, but I still need to include him 
> in the non-project staff.
> 
> Sorry I was not clearer about pointing that out. I was a 
> little fuzzy in the head yesterday.
> Thanks,
> Joelle
> 
> 
> Michael Kay wrote:
> > One of the tricks of the trade in doing maths and physics 
> questions at
> > school was that they never provided any information you 
> didn't need. Real
> > life isn't like that, and as far as I can see the first 
> file is a red
> > herring, it's not needed and it's only there to confuse us.
> >
> > If $psr is the <project_staff_roles> element and $pid is 
> the project id,
> > then the project staff are:
> >
> >  <people>
> >    <xsl:copy-of 
> select=$psr/project_staff_role[@project_id=$pid]/staff"/>
> >  </people>
> >
> > and the non-project staff are:
> >
> >  <people>
> >   <xsl:copy-of 
> select=$psr/project_staff_role[@project_id!=$pid]/staff"/>
> >  </people>
> >
> > Or have I overlooked something?
> >
> > Regards,
> >
> > Michael Kay
> > http://www.saxonica.com/
> > http://twitter.com/michaelhkay 
> >
> >
> >
> >   
> >> -----Original Message-----
> >> From: Joelle Tegwen [mailto:tegwe002@xxxxxxx] 
> >> Sent: 03 June 2009 22:33
> >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >> Subject: [xsl] Joining xml documents on the fly
> >>
> >> Ok, I'm in totally over my head here. I'm hoping someone can 
> >> help me out.
> >>
> >> I've got 2 external (reference) documents I'm including into 
> >> my stylesheet.
> >>
> >> One is a list of staff. It looks like this (edited for brevity):
> >>
> >> <people>
> >>     <staff staff_id="123456789" alpha_key="A" 
> sort_key="AberyBrian">
> >>         <display_name>Brian H Abery</display_name>
> >>     </staff>
> >>     <staff staff_id="987654321" alpha_key="A" sort_key="AlbusDeb">
> >>         <display_name>Deb Albus</display_name>
> >>     </staff>
> >>     <staff staff_id="456321789" alpha_key="A" 
> sort_key="AltmanJason">
> >>         <display_name>Jason R Altman</display_name>
> >>     </staff>
> >> </people>
> >>
> >> And the other is the three way join between staff, projects 
> >> and roles <project_staff_roles>
> >>     <project_staff_role project_id="1" staff_id="123456789" 
> >> role_id="staff">
> >>         <staff staff_id="123456789" alpha_key="A" 
> >> sort_key="AberyBrian">
> >>             <display_name>Brian H Abery</display_name>
> >>         </staff>
> >>     </project_staff_role>
> >>     <project_staff_role project_id="1" staff_id="123456789" 
> >> role_id="director">
> >>        <staff staff_id="123456789" alpha_key="A" 
> >> sort_key="AberyBrian">
> >>             <display_name>Brian H Abery</display_name>
> >>         </staff>
> >>     </project_staff_role>
> >>     <project_staff_role project_id="2" staff_id="987654321" 
> >> role_id="staff">
> >>         <staff staff_id="987654321" alpha_key="A" 
> sort_key="AlbusDeb">
> >>             <display_name>Deb Albus</display_name>
> >>         </staff>
> >>     </project_staff_role>
> >> </project_staff_roles>
> >>
> >> I want to break this into two groups based on the current 
> project_id.
> >> So if I'm viewing project_id=1
> >> I want two groups of people
> >>
> >> Project Staff:
> >> <people>
> >>     <staff staff_id="123456789" alpha_key="A" 
> sort_key="AberyBrian">
> >>         <display_name>Brian H Abery</display_name>
> >>     </staff>
> >> </people>
> >>
> >> Non-Project-Staff
> >> <people>
> >>     <staff staff_id="987654321" alpha_key="A" sort_key="AlbusDeb">
> >>         <display_name>Deb Albus</display_name>
> >>     </staff>
> >>     <staff staff_id="456321789" alpha_key="A" 
> sort_key="AltmanJason">
> >>         <display_name>Jason R Altman</display_name>
> >>     </staff>
> >> </people>
> >>
> >> I've got the following variables in my document:
> >> <xsl:variable name="staff" select="document($ref_staff)/people"/>
> >> <xsl:variable name="staff_roles" 
> >> select="document($ref_project_staff_role)/project_staff_roles/
> >> project_staff_role[@role_id='staff']"/>
> >> <xsl:variable name="project_staff" 
> >> select="$staff_roles[@project_id=$[project_id]/staff"/>
> >> <xsl:variable name="non_project_staff" select="?????"/>
> >>
> >> How do I even go about thinking about this? I've tried 
> >> googling it but I have no idea what to search on. I've tried 
> >> various iterations of keys, etc but I just can't get it.
> >>
> >> The final xslt that gives the desired output is:
> >>          <xsl:if test="count($project_staff) > 0">
> >>             <fieldset class="span-18 last col-wrap">
> >>                 <legend class="quiet">
> >>                     <xsl:value-of
> >> select="ancestor::project/associates/associate/title"/>
> >>                     People</legend>
> >>                 <xsl:call-template name="layout_3column">
> >>                     <xsl:with-param name="objects" 
> >> select="$project_staff"/>
> >>                 </xsl:call-template>
> >>             </fieldset>
> >>         </xsl:if>
> >>        
> >>         <xsl:if test="count($non_project_staff) > 0">
> >>             <fieldset class="span-18 last col-wrap">
> >>                 <legend class="quiet">All Other People</legend>
> >>                 <div id="tabs">
> >>                     <ul>
> >>                         <xsl:for-each
> >>                             
> >> 
> select="$staff/staff/@alpha_key[generate-id()=generate-id(key('alpha',
> >> .))]">
> >>                             <xsl:if
> >> test="count($non_project_staff[@alpha_key = current()]) > 0">
> >>                                 <xsl:call-template name="tab_link">
> >>                                     <xsl:with-param 
> >> name="alpha_string" 
> >> select="."/>
> >>                                 </xsl:call-template>
> >>                             </xsl:if>
> >>                         </xsl:for-each>
> >>                     </ul>
> >>                     <xsl:for-each
> >>                         
> >> 
> select="$staff/staff/@alpha_key[generate-id()=generate-id(key('alpha',
> >> .))]">
> >>                         <xsl:if
> >> test="count($non_project_staff[@alpha_key = current()]) > 0">
> >>                             <xsl:call-template name="tab_data">
> >>                                 <xsl:with-param 
> name="alpha_string" 
> >> select="."/>
> >>                                 <xsl:with-param name="objects"
> >>                                     
> >> select="$non_project_staff[@alpha_key = current()]"/>
> >>                             </xsl:call-template>
> >>                         </xsl:if>
> >>                     </xsl:for-each>
> >>                 </div>
> >>                
> >>             </fieldset>
> >>         </xsl:if>
> >>
> >>
> >> I hope this is clear. Any help would be much appreciated.
> >>
> >> Thanks in advance.
> >> Joelle

Current Thread