[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] Comparing attribute values of nodes in different contexts
Subject: Re: [xsl] Comparing attribute values of nodes in different contexts From: Wolfgang Laun <wolfgang.laun@xxxxxxxxx> Date: Sat, 6 Feb 2010 10:22:35 +0100 |
This is a typical application for "Grouping", which is explained, with examples, in http://www.w3.org/TR/xslt20/#grouping. Except for the HTML tags, this should do it: <xsl:template match="/caller"> <xsl:for-each-group select="contact" group-by="@callID"> Call connected on <xsl:value-of select="@timeCallInitiated"/>. There are <xsl:value-of select="count(current-group())"/> related connections as follows: <xsl:for-each select="current-group()"> Connection: <xsl:value-of select="@timeAgentConnected"/> to agent <xsl:value-of select="@agent"/> </xsl:for-each> </xsl:for-each-group> </xsl:template> -W PS: Seems like you got an answer, so you do know how to ask ;-) On Fri, Feb 5, 2010 at 11:46 PM, Robert Bourdeau <rhbourdeau@xxxxxxxxx> wrote: > > Consider the following XML document, showing a set of telephone calls > received from a specific telephone number, along with the various > internal connections to different employees from the time the call is > first connected to the phone system until the call is terminated. > > > <caller callerID="9195551212"> > <contact > callID="1" > contactID="3" > timeCallInitiated="2010-02-04T09:42:58" > timeAgentConnected="2010-02-04T09:43:23" > agent="Jamie Smith" > /> > <contact > callID="1" > contactID="2" > timeCallInitiated="2010-02-04T09:42:58" > timeAgentConnected="2010-02-04T09:43:23" > agent="Angela Jones" > /> > <contact > callID="1" > contactID="1" > timeCallInitiated="2010-02-04T09:42:58" > timeAgentConnected="2010-02-04T09:42:58" > agent="Desi Johnson" > /> > <contact > callID="2" > contactID="3" > timeCallInitiated="2010-02-04T09:41:45" > timeAgentConnected="2010-02-04T09:42:10" > agent="Jamie Smith" > /> > <contact > callID="2" > contactID="2" > timeCallInitiated="2010-02-04T09:41:45" > timeAgentConnected="2010-02-04T09:42:10" > agent="Angela Jones" > /> > <contact > callID="2" > contactID="1" > timeCallInitiated="2010-02-04T09:41:45" > timeAgentConnected="2010-02-04T09:41:45" > agent="Julia Billings" > /> > <contact > callID="3" > contactID="2" > timeCallInitiated="2010-01-26T13:29:21" > timeAgentConnected="2010-01-26T13:29:49" > agent="Angela Jones" > /> > <contact > callID="3" > contactID="1" > timeCallInitiated="2010-01-26T13:29:21" > timeAgentConnected="2010-01-26T13:29:21" > agent="Desi Johnson" > /> > </caller> > > Ideally this XML file would be one level deeper where all "contacts" > having the same value for the callID attribute are grouped together > under a single node. I cannot change that however. And therein lies my > problem. To dumb this down I'd like output as follows: > > Call Connected on 2010-02-04 > There are 3 related connections as follows: > Connection: 2010-02-04T09:43:23 to agent Jamie Smith > Connection: 2010-02-04T09:43:23 to agent Angela Jones > Connection: 2010-02-04T09:42:58 to agent Desi Johnson > Call Connected on 2010-02-04 > There are 3 related connections as follows: > Connection: 2010-02-04T09:42:10 to agent Jamie Smith > Connection: 2010-02-04T09:42:10 to agent Angela Jones > Connection: 2010-02-04T09:41:45 to agent Julia Billings > Call Connected on 2010-01-26 > There are 2 related connections as follows: > Connection: 2010-01-26T13:29:49 to agent Angela Jones > Connection: 2010-01-26T13:29:21 to agent Desi Johnson > > The Key problem is just one little piece of this: > 'There are 3 related connections as follows:' > How do I get the '3' computed? > > For my application, it is important that I output that number BEFORE I > output each of the connections. > Here's the code to produce that output above (with one incomplete part): > > <xsl:template match="/caller"> > <xsl:for-each select="contact"> > <xsl:if test="not(@callID = preceding-sibling::contact[1]/@callID)"> > <br/> > Call connected on <xsl:value-of > select="scripts:justDate(@timeCallInitiated)"/> > <br/> > There are > <xsl:value-of select="count(/caller/contact[@callID = ?])"/> > related connections as follows: > </xsl:if> > > <br/> > Connection: > <xsl:value-of select="@timeAgentConnected"/> > to agent > <xsl:value-of select="@agent"/> > </xsl:for-each> > </xsl:template> > > See that question mark '?' up there? What goes there? The @callID > refers to the context of the preceding XPath expression. I want to > only count those 'contact' nodes that have the same attribute value of > 'callID' as the node being currently processed by the for-each node. > But I have no idea how to reference the context of the for-each node > from within that count function. > > I clearly need a better theoretical understanding of how different > contexts are used in the XSL processing. But there seems to be a large > gap between the technical documentation at w3c and how to even ASK > about problems like this! > > Any help here? > > A totally alternative approach to the XSL stylesheet is perfectly acceptable. > > Best > > Robert H. Bourdeau
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Comparing attribute values of, Robert Bourdeau | Thread | [xsl] XML to SVG via XSLT 2.0, Dave Pawson |
RE: [xsl] NCName, QName and colons, Michael Kay | Date | [xsl] XML to SVG via XSLT 2.0, Dave Pawson |
Month |