This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Multiple instances of the same nodeset - is this possible.
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Mon, 5 Aug 2002 07:23:36 +0100
- Subject: RE: [xsl] Multiple instances of the same nodeset - is this possible.
- Reply-to: xsl-list at lists dot mulberrytech dot com
Your question suggests you are rather confused about node-sets. I can't
pin down exactly what your confusion is. A node-set is a set of nodes,
nothing more. XSLT doesn't care whether two variables containing the
same set of nodes are "the same node-set" or "different node-sets",
because there is no concept of node-set identity.
All of this has nothing to do with why your code doesn't work. Your code
is relying on some relationship between the attributes ListID,
MessageID, and isNewline: you haven't explained this relationship to us,
so I won't try and reverse-engineer your design. If you simply want to
do what you described, and start a new record whenever isNewLine is
true, then your choices are:
(a) a recursive template
(b) Muenchian grouping, using
generate-id((.|preceding-sibling::row)[@isNewLine='true'])
as the grouping key
(c) the XSLT 2.0 construct
<xsl:for-each-group group-starting-with="row[@isNewLine='true']">
Michael Kay
Software AG
home: Michael.H.Kay@ntlworld.com
work: Michael.Kay@softwareag.com
> -----Original Message-----
> From: owner-xsl-list@lists.mulberrytech.com
> [mailto:owner-xsl-list@lists.mulberrytech.com] On Behalf Of
> John Aschenbrenner
> Sent: 04 August 2002 23:01
> To: 'XSL-List@lists.mulberrytech.com'
> Subject: [xsl] Multiple instances of the same nodeset - is
> this possible.
>
>
> I often find myself in a situation where I would like to
> traverse a nodeset multiple times simultaneously in a document.
> Example:
> <root>
> <row FieldName="CustName" Message="FREELOADER FREDDIE"/>
> <row ListID="391" FieldName="ListOfMessages"
> Message="This is a message." MessageID="391" IsNewline="True"/>
> <row ListID="402" FieldName="ListOfMessages"
> Message="Freddie has up to 1 full month" MessageID="402"
> IsNewline="True"/>
> <row ListID="403" FieldName="ListOfMessages"
> Message="to pay off his bill." MessageID="402" IsNewline="False"/>
> <row ListID="408" FieldName="ListOfMessages"
> Message="Most recent data for FREELOADER FREDDIE."
> MessageID="408" IsNewline="True"/>
> <row ListID="415" FieldName="ListOfMessages"
> Message="Favorite sports and hobbies: Bicycling backgammon"
> MessageID="415" IsNewline="True"/>
> <row ListID="416" FieldName="ListOfMessages"
> Message="and sailing." MessageID="415" IsNewline="False"/>
> <row ListID="514" FieldName="ListOfMessages"
> Message="Signed liability waiver If participating in
> category" MessageID="514" IsNewline="True"/>
> <row ListID="515" FieldName="ListOfMessages"
> Message="A sporting activities." MessageID="514" IsNewline="False"/>
> </root>
>
>
> What I would like to do with this data is output it in a
> tabular format. If the attribute IsNewline="True" then I
> have the beginning of a new record else just concatenate it
> to the previous.
>
> I have a template that looks like this.
> <xsl:template name="GetMessages">
> <xsl:param name="GetMessagesSet1"/>
> <xsl:param name="GetMessagesSet2"/>
>
> <xsl:for-each select="$GetMessagesSet1[@IsNewline='True']">
> <xsl:variable name="i" select="position()"/>
> <xsl:variable name="MessageID"
> select="$GetMessagesSet1[$i]/@ListID"
> <tr>
> <td valign="bottom" align="left" width="10%">
> <p class="feedbackMsg">______</p>
> </td>
> <td align="left" width="80%">
> <p class="feedbackMsg">
>
> <xsl:for-each
> select="$GetMessagesSet2[@MessageID=$MessageID]">
> <xsl:variable name="j"
> select="position()"/>
> <xsl:value-of
> select="$GetMessagesSet1[@MessageID=$MessageID][$j]/@Message"/>
> </xsl:for-each>
>
> </p>
> </td>
> <td valign="bottom" align="middle" width="10%">
> <p
> class="feedbackMsg">________________</p>
> </td>
> </tr>
> </xsl:for-each>
>
> </xsl:template>
>
> As you may have guessed when I call this template as follows
> <xsl:call-template name="GetMessages">
> <xsl:with-param name="GetMessagesSet1"
> select="z:row[@FieldName='ListOfMessages']"/>
> <xsl:with-param name="GetMessagesSet2"
> select="z:row[@FieldName='ListOfMessages']"/>
> </xsl:call-template>
>
> it does not work as I would like because even though I think
> I have created two independent nodesets. I only have one.
>
> My question is this - Is it somehow possible to have two
> independent nodesets with identical data that you can
> traverse simultaneously?
>
> I have since solved my problem by using a recursive template
> - however I would still like my question answered.
>
> Thank you,
> John Aschenbrenner
> Ignition Mortgage Technology Solutions, Inc.
> jaschenbrenner@ignitionmts.com
> Ph: (253)858-8955 x 239
> http://www.ignitionmts.com
>
>
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list