|
Subject: [xsl] XSLT 2.0 Grouping in XSLT 1.0 (was TEI > XML) From: Daniel O'Donnell <daniel.odonnell@xxxxxxxx> Date: Wed, 13 Apr 2005 00:05:01 -0600 |
<p>Text <quote> <p>quotation text</p> </quote> end text.</p>
<p>text <blockquote> <p>quotation text</p> </blockquote> end text.</p>
<p>text</p> <blockquote> <p>quotation text</p> </blockquote> <p>end text</p>
Source XML document:
<p>Do <em>not</em>: <ul> <li>talk,</li> <li>eat, or</li> <li>use your mobile telephone</li> </ul> while you are in the cinema.</p>
Desired output:
<p>Do <em>not</em>:*</p>* <ul> <li>talk,</li> <li>eat, or</li> <li>use your mobile telephone</li> </ul> *<p>*while you are in the cinema.</p>
Solution:
This requires creating a p element around the maximal sequence of sibling nodes that does not include a ul or ol element.
This can be done by using group-adjacent, with a grouping key that is true if the element is a ul or ol element, and false otherwise:
<xsl:template match="p">
<xsl:for-each-group select="node()" group-adjacent="self::ul or self::ol">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:copy-of select="current-group()"/> </xsl:when>
<xsl:otherwise>
<p>
<xsl:copy-of select="current-group()"/>
</p>
</xsl:otherwise> </xsl:choose>
</xsl:for-each-group>
</xsl:template>
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable> <xsl:template match="/">
<html>
<head>
<title>Quotes test</title>
</head>
<body>
<xsl:apply-templates select="//body"/>
</body>
</html>
</xsl:template> <xsl:template match="body">
<xsl:apply-templates/>
</xsl:template> <xsl:template match="quote[p]">
<blockquote>
<xsl:apply-templates/>
</blockquote><xsl:value-of select="$newline"/>
</xsl:template> <xsl:template match="table">
<table><xsl:value-of select="$newline"/>
<xsl:apply-templates/>
</table><xsl:value-of select="$newline"/>
</xsl:template> <xsl:template match="row">
<tr><xsl:value-of select="$newline"/>
<xsl:apply-templates/><xsl:value-of select="$newline"/>
</tr><xsl:value-of select="$newline"/>
</xsl:template> <xsl:template match="cell">
<td>
<xsl:apply-templates/>
</td>
</xsl:template> <xsl:template match="list">
<xsl:choose>
<xsl:when test="@rend='ordered'">
<ol><xsl:value-of select="$newline"/>
<xsl:apply-templates/>
</ol><xsl:value-of select="$newline"/>
</xsl:when>
<xsl:otherwise>
<ul><xsl:value-of select="$newline"/>
<xsl:apply-templates/>
</ul><xsl:value-of select="$newline"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template> <xsl:template match="item">
<li>
<xsl:apply-templates/>
</li><xsl:value-of select="$newline"/>
</xsl:template> <xsl:template match="p">
<xsl:for-each-group select="node()"
group-adjacent="self::quote[p] or self::table or self::list">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:apply-templates select="current-group()"/>
</xsl:when>
<xsl:otherwise>
<p>
<xsl:copy-of select="current-group()"/>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>Thanks again. -dan
-- Daniel Paul O'Donnell, PhD Associate Professor of English University of Lethbridge Lethbridge AB T1K 3M4 Tel. (403) 329-2377 Fax. (403) 382-7191 E-mail <daniel.odonnell@xxxxxxxx> Home Page <http://people.uleth.ca/~daniel.odonnell/> The Digital Medievalist Project: <http://www.digitalmedievalist.org/>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] How to output trademark c, Maria Amuchastegui | Thread | RE: [xsl] XSLT 2.0 Grouping in XSLT, Michael Kay |
| Re: [xsl] Extra newline remove on t, omprakash . v | Date | Re: [xsl] how to translate XML with, Magic Finger |
| Month |