Subject: Re: [xsl] Wrapping nodes outside tables into paragraphs From: "Martynas Jusevičius martynas@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 22 May 2014 20:23:51 -0000 |
Thanks a lot Graydon! And sorry, yes I'm using XSLT 2.0. I suspected xsl:for-each-group can be used to solved this. I just never seem to get the group- criteria right, or maybe I didn't realize the grouping key could be used so flexibly. My template now looks like this and seems to work: <xsl:template match="tei:note[tei:table or tei:figure]" mode="xhtml"> <xsl:for-each-group select="node()" group-adjacent="if (self::tei:table or self::tei:figure) then 'block' else 'inline'"> <xsl:choose> <xsl:when test="current-grouping-key() eq 'block'"> <xsl:apply-templates select="current-group()" mode="#current"/> </xsl:when> <xsl:when test="current-grouping-key() eq 'inline'"> <xhtml:p> <xsl:apply-templates select="current-group()" mode="#current"/> </xhtml:p> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Grouping error</xsl:message> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:template> Martynas On Thu, May 22, 2014 at 9:55 PM, Graydon graydon@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > On Thu, May 22, 2014 at 07:19:02PM -0000, Martynas JuseviD ius martynas@xxxxxxxxxxxx scripsit: >> I have TEI markup where nodes (text nodes and some elements) are >> interspersed with table and figure elements, like this: >> >> <note> >> text text <ref type="whatever">text</ref> >> <table>...</table> >> text text >> <figure>...</figure> >> text text >> <table>...</table> >> <table>...</table> >> text text >> </note> >> >> There can be nodes before, between, and after tables. >> >> I want to produce a corresponding XHTML while also wrapping all the >> nodes between tables into <p>, so they're on the same block-level (for >> simplicity, lets say <xhtml:img> is also block-level): > > This is a classic use case for XSLT 2.0's for-each-group instruction. > > Are you using 2.0? > > If so, an approach like > > <xsl:for-each-group select="note/node()" group-adjacent="if > (self::table) then 'table' else 'interstitial'"> > > <xsl:choose> > <xsl:when test="current-grouping-key() eq 'table'"> > <!-- do what you do to tables --> > </xsl:when> > <xsl:when test="current-grouping-key() eq 'interstial'> > <!-- wrap everything else --> > <xsl:otherwise> > <!-- you should never get here; die loudly --> > </xsl:otherwise> > </xsl:choose> > > </xsl:for-each-group> > > ought to work. (The pattern also extends.) > > If you have to individual wrap adjacent tables you may want a different > grouping attribute, and you might want to select > note/node()[normalize-space()] instead, to avoid white-space only text > nodes. > > -- Graydon
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Wrapping nodes outside ta, Graydon graydon@xxxx | Thread | [xsl] fo:footnote and keep precedin, Mario Madunic mario. |
Re: [xsl] Wrapping nodes outside ta, Graydon graydon@xxxx | Date | Re: [xsl] Condition "last" and forc, Jesper Tverskov jesp |
Month |