Subject: RE: [xsl] XSLT2, collection(), and xsl:key From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 1 Feb 2008 17:45:11 -0000 |
Looks to me something like this: <xsl:variable name="pop" select="collection('...')//*[@type]"/> <xsl:for-each-group select="$pop" group-by="node-name(.)"> <h1><xsl:value-of select="current-grouping-key()"/></h1> <table> <tr> <td>document</td> <xsl:variable name="types" select="distinct-values(current-group()/@type)"/> <xsl:for-each select="$types"> <td><xsl:value-of select="."/></td> </xsl:for-each> </tr> <xsl:for-each-group select="current-group()" group-by="ancestor::p/@xml:id"> <tr> <td><xsl:value-of select="current-grouping-key()"/></td> <xsl:for-each select="$types"> <td><xsl:value-of select="count(current-group()[@type=current()])"/></td> </xsl:for-each> </tr> </table> </xsl:for-each-group> Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: James Cummings [mailto:cummings.james@xxxxxxxxx] > Sent: 01 February 2008 17:23 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] XSLT2, collection(), and xsl:key > > Hiya, > > I'm using the collection() function and Saxon to produce some > statistics about how many of which elements of which type in > a particular set of documents. > > Let's say that document one has something like: > > <p xml:id="doc1" type="hypothetical"> > There is some text with <seg type="foo">some foo</seg> and > occasionally <seg type="blort">blort</seg> and <other > type="wibble">wibble</other></p> > > > and document two (and up to some really large number) is like: > > <p xml:id="doc2"> > There is another doc with <seg type="foo">some foo</seg> and > occasionally <seg type="notBlort">notBlort</seg> and <other > type="fluffy">fluffy other</other> and <some > name="thing">someThing</some></p> > > What I want to produce are tables of counts of specific > elements, by document and type. So something like the > following (though using table/row/cell xml markup): > > > table: other > document | fluffy | wibble | stuff > doc1 | 0 | 1 | 0 > doc2 | 1 | 0 | 0 > doc3 | 20 | 12 | 54 > > table: seg > document | blort | foo | notBlort > doc1 | 1 | 1 | 0 > doc2 | 0 | 1| 1 > doc3 | 23 | 44 | 58 > > table: some > document | thing | else | now > doc1 | 0 | 0 | 0 > doc2 | 1 | 0 | 0 > doc3 | 12 | 5 | 24 > > I can build this manually (and for one element I have done > so) by doing: > > <xsl:variable name="docs" > select="collection('../../working/xml/docs.xml')"/> > <xsl:template name="main"> > <table><head>seg by type</head> > <row rend="label"> > <cell>document</cell> > <cell>blort</cell> > <cell>foo</cell> > <cell>notBlort</cell> > </row> > <xsl:for-each select="$docs//p"> <!-- let's pretend p is the > root element --> <row> <xsl:variable name="doc" > select="@xml:id"/> <cell><xsl:value-of select="$doc"/></cell> > <cell><xsl:value-of select="count(.//seg[@type='blort'])</cell> > <cell><xsl:value-of select="count(.//seg[@type='foo'])</cell> > <cell><xsl:value-of select="count(.//seg[@type='notBlort'])</cell> > </row> > </xsl:for-each> > </table> > </xsl:template> > > But that isn't really the point now is it? I tried to use > <xsl:key> but I ran into the problem of it not liking the > collection() function as part of the match. > > What I want to do is be able to say for-each doc, build me a > table of all the (let's pretend unknown) values of this > attribute on this element. So something like: > > <xsl:for-each select="$docs//p"> > <xsl:value-of select="my:function(other/@type, seg/@type, > thing/@name, new/@type)"/> </xsl:for-each> > > and without knowing the values of @type in advance it makes a > table like above of them (using distinct-values()?) and > counting their occurrences. > > This is a case where I know it must be possible, and I could > just go and do it manually, (in reality there are about 10 > elements with a number of attributes, with around 20 values > each), but it just seems > *wrong* to do it that way. ;-) > > Suggestions? > > Thanks, > > -James
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XSLT2, collection(), and , Andrew Welch | Thread | Re: [xsl] XSLT2, collection(), and , James Cummings |
Re: [xsl] XSLT2, collection(), and , Andrew Welch | Date | [xsl] understanding attributes and , Terry Ofner |
Month |