Subject: [xsl] Enjoy! (was: Re: [xsl] Limit the length of transformed content from source text nodes) From: Blue Gecko <bluegecko@xxxxxxxxx> Date: Tue, 01 Nov 2005 10:40:40 +0100 |
<!-- XSLT --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:variable name="snipSize" select="25"/>
<xsl:template match="/"> <root> <xsl:apply-templates mode="snippet" select="foo/content/node()[1]"/> </root> </xsl:template>
<xsl:template match="*|text()" mode="snippet"> <xsl:param name="currentLength" select="0"/>
<xsl:choose> <!-- Text node --> <xsl:when test="self::text()"> <xsl:choose> <!-- Does the text fit the lasting room? --> <xsl:when test="$newLength <= $snipSize"> <!-- Output the text content! --> <xsl:value-of select="normalize-space(.)"/>
<xsl:text>[...]</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:when> <!-- Any other kind of node --> <xsl:otherwise> <!-- Apply the identity transformation to the current node! --> <xsl:copy> <xsl:copy-of select="@*"/>
<!-- Go deep inside the subnode hierarchy (vertical axis)! --> <xsl:apply-templates select="child::node()[1]" mode="snippet"> <xsl:with-param name="currentLength" select="$currentLength"/> </xsl:apply-templates> </xsl:copy>
<!-- OUTPUT --> <?xml version="1.0" encoding="UTF-8"?> <root> <section> <title>1st section</title> <content>This is the<strong>1st[...]</strong></content> </section> </root>
if you need to snip at arbitrary depth it gets harder, this just adds complete elements until you are too long or snips top level text
==============
<foo>
<item>This is the <strong>body</strong> of an article interspersed with <strong>markup tags</strong> I'm striving to snip.</item>
</foo>
==============
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="tl" select="26"/>
<xsl:template match="foo">
<snippets>
<xsl:apply-templates/>
</snippets>
</xsl:template>
<xsl:template match="item">
<snippet>
<xsl:apply-templates mode="s" select="node()[1]"/>
</snippet>
</xsl:template>
<xsl:template match="strong">
<i>
<xsl:apply-templates/>
</i>
</xsl:template>
<xsl:template match="*" mode="s">
<xsl:param name="l" select="0"/>
<xsl:variable name="x">
<xsl:apply-templates select="."/>
</xsl:variable>
<xsl:variable name="xl" select="string-length($x)"/>
<xsl:choose>
<xsl:when test="$l + $xl <= $tl">
<xsl:copy-of select="$x"/>
<xsl:apply-templates select="following-sibling::node()[1]" mode="s">
<xsl:with-param name="l" select="$l+$xl"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>[...]</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()" mode="s"> <xsl:param name="l" select="0"/>
<xsl:variable name="xl" select="string-length(.)"/> <xsl:choose> <xsl:when test="$l + $xl <= $tl"> <xsl:value-of select="."/> <xsl:apply-templates select="following-sibling::node()[1]" mode="s"> <xsl:with-param name="l" select="$l+$xl"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring(.,1,$l + $tl - $xl)"/>[...]</xsl:otherwise> </xsl:choose> </xsl:template>
</xsl:stylesheet>
==============
$ saxon snip.xml snip.xsl <?xml version="1.0" encoding="utf-8"?><snippets> <snippet>This is the <i>body</i> of an a[...]</snippet> </snippets>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Indented HTML Lists > Mul, Gogo Estragon | Thread | Re: [xsl] foreach, preceding-siblin, Mingqiang Yu |
Re: [xsl] Indented HTML Lists > Mul, Gogo Estragon | Date | Re: [xsl] foreach, preceding-siblin, Mingqiang Yu |
Month |