Dear Xiaocun,
To define two keys for the two groups with the same
name but different "use":
<xsl:key name="QuestionnaireKey" match=//row[(_at_)row <
20]" use="string(cell[(_at_)column=2])"/>
<xsl:key name="QuestionnaireKey" match=//row[(_at_)row >
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 > 20 and
@row < 30][count(.|key('QuestionnaireKey',
string(cell[(_at_)column=1]))[1]) = 1]"/>
but this will miss questionnaire QC.
Huh? I can see how it will miss questionnaire QB, but not 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?
I don't think so, because it uses @column=1 for all rows,
instead of using @column=2 for the first group and @column=1
for the second group.
If so, how can I tell if the
row being processed is from group 1 (Questionnaire) or
2 (Question)?
Above, you had "@row > 20 and @row < 30". Do you know
these boundary numbers in advance? If so, why not use them.
Here's a select expression and template that should allow you to
process each Questionnaire once...
<xsl:apply-templates select="/range/row[count(.|key('QuestionnaireKey',
string(cell[(_at_)column=1 and
../@row > 20] |
cell[(_at_)column=2 and
../@row < 20]))[1]) = 1]" />
...
<xsl:template match="row">
<p>
<xsl:choose>
<xsl:when test="@row < 20">
Processing Questionnaire <xsl:value-of select="cell[(_at_)column=2]"
/>
</xsl:when>
<xsl:otherwise>
Processing Questionnaire <xsl:value-of select="cell[(_at_)column=1]"
/>
</xsl:otherwise>
</xsl:choose>
</p>
</xsl:template>
I tried this with your test data and it displayed
Processing Questionnaire QA
Processing Questionnaire QB
Processing Questionnaire QC
Does this solve your problem?
Lars
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list