|
Subject: Re: [xsl] Wrapping nodes outside tables into paragraphs From: "Graydon graydon@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 22 May 2014 19:54:43 -0000 |
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 -> |
|---|---|---|
| [xsl] Wrapping nodes outside tables, Martynas Jusevičius | Thread | Re: [xsl] Wrapping nodes outside ta, Martynas Jusevičius |
| [xsl] Wrapping nodes outside tables, Martynas Jusevičius | Date | Re: [xsl] Wrapping nodes outside ta, Martynas Jusevičius |
| Month |