xsl-list
[Top] [All Lists]

Re: use of xsl:key in cross-referencing

2003-03-20 16:36:33
Hi, Wendell:

Thanks for the idea of define two keys for the two
groups with the same name but different "use" value,
but I was unable to find anything in regard to it at
Jenni's website, xsl-list archive (using keywords "two
key;same name;") or google web/group.  I did some
thinking myself and still don't see how that works. 
Following is an example, having rows 10-19 being the
first group (Questionnaire) and 20-29 being the second
group (Question):
<range>
<row row="16">
        <cell column="1">Questionnaire A</cell>
        <cell column="2">QA</cell>
        <cell column="3">Questionnaire A, two
questions</cell>
</row>
<row row="17">
        <cell column="1">Questionnaire B</cell>
        <cell column="2">QB</cell>
        <cell column="3">Questionnaire B, empty with no
questions</cell>
</row>

<row row="27">
        <cell column="1">QA</cell>
        <cell column="2">Questionnaire A, Question 1<cell>
</row>
<row row="28">
        <cell column="1">QA</cell>
        <cell column="2">Questionnaire A, Question 2</cell>
</row>
<row row="29">
        <cell column="1">QC</cell>
        <cell column="2">Questionnaire C, Question 1</cell>
</row>
</range>

In this case, questionnaire QA has two questions, QB
is only referred in the 1st group and QC is only
referred in the 2nd group.  What I need is to be able
to process each of QA/QB/QC.

To define two keys for the two groups with the same
name but different "use":
<xsl:key name="QuestionnaireKey" match=//row[(_at_)row &lt;
20]" use="string(cell[(_at_)column=2])"/>
<xsl:key name="QuestionnaireKey" match=//row[(_at_)row &gt;
20]" use="string(cell[(_at_)column=1])"/>

Use Muenchian method to process each just once, for
the 2nd group:
<xsl:apply-templates select="//row[(_at_)row &gt; 20 and
@row &lt; 30][count(.|key('QuestionnaireKey',
string(cell[(_at_)column=1]))[1]) = 1]"/>
but this will miss questionnaire QC.

I guess to take advantage of the combined key, I need
to do select on all rows, like:
<xsl:apply-templates
select="//row[count(.|key('QuestionnaireKey',
string(cell[(_at_)column=1]))[1]) = 1]"/>
Would the above work?  If so, how can I tell if the
row being processed is from group 1 (Questionnaire) or
2 (Question)?

Thanks,
Xiaocun

--- Wendell Piez <wapiez(_at_)mulberrytech(_dot_)com> wrote:
Xiaocun,

At 07:39 PM 3/19/2003, you wrote:
  When I process the 1st group of rows
(questionnaires), I call key() function by
passing
in
the value in the 2nd cell.

Ignore the first group of rows and just iterate
over
the questions, using
your key to group them.

That was the first came to my mind as well, but the
problem is that a questionnaire defined in 1st
group
may not be used in the 2nd group, those will be
omitted.  I am looking for a way to combine the two
groups so that every questionnaire is processed as
long as it is used in 1st (questionnaires) or 2nd
group (questions). Order to me is not important.

In that case, you can iterate over and de-duplicate
from both groups.

In fact, you can define two keys for the two groups
with the same name, 
only different "use" values, which could help in
this.

I'd be more explicit about this, except (a) it's
much harder to write up 
without some sample code to chew on (please post
again with your source and 
problem statement?), and (b) I'm in a time crunch
today.

But I learned this trick from Jeni: I think if you
look in the FAQ and on 
Jeni's site (http://www.jenitennison.com), where
grouping is covered in 
some detail, you could find something.

Cheers,
Wendell



======================================================================
Wendell Piez                           
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc.               
http://www.mulberrytech.com
17 West Jefferson Street                    Direct
Phone: 301/315-9635
Suite 207                                         
Phone: 301/315-9631
Rockville, MD  20850                                
Fax: 301/315-8285

----------------------------------------------------------------------
   Mulberry Technologies: A Consultancy Specializing
in SGML and XML

======================================================================


 XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list



__________________________________________________
Do you Yahoo!?
Yahoo! Platinum - Watch CBS' NCAA March Madness, live on your desktop!
http://platinum.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list