Subject: RE: 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: 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: 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
|