|
Subject: RE: [xsl] XSLT2, collection(), and xsl:key From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 1 Feb 2008 18:39:00 -0000 |
OK, I misunderstood. I thought that's what you meant by doing it manually,
and that that wasn't what you wanted to do.
To make it data-driven like this, you get rid of the outer
xsl:for-each-group and replace it with an <xsl:for-each select="table">, and
then you do something like
<xsl:variable name="table" select="."/>
<xsl:variable name="pop"
select="collection('...')//*[name()=$table/@element[@*[name()=$table/@att]]]
"/>
and then
<xsl:variable name="types"
select="distinct-values($pop/@*[name()=$table/@att)"/>
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: James Cummings [mailto:cummings.james@xxxxxxxxx]
> Sent: 01 February 2008 18:07
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] XSLT2, collection(), and xsl:key
>
> Hi again,
>
> I must be missing something (I usually am), if I'm reading
> this (and Andrew's grouping in a variable version), they both
> apply to all elements, and here all elements with only a
> @type. Part of my problem is that I definitely *don't* want
> to do all elements, and in some cases more than one attribute
> on some elements. So I really need to feed it a list of
> element/@attrib rather than just do everything matching a pattern.
>
> I mean I could build a list in the xslt in a variable something like:
> <xsl:variable name="tables">
> <table element="seg" att="type"/>
> <table element="seg" att="sub-type"/>
> <table element="other" att="type"/>
> <table element="thing" att="name"/>
> <!-- etc -->
> </xsl:variable>
>
> And then try the grouping selecting each $tables/table ?
> Would that work?
>
> -James
>
> On Feb 1, 2008 5:45 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > 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 , James Cummings | Thread | Re: [xsl] XSLT2, collection(), and , James Cummings |
| Re: [xsl] understanding attributes , Colin Paul Adams | Date | Re: [xsl] XSL FO Image alignment pr, Jay Bryant |
| Month |