xsl-list
[Top] [All Lists]

RE: [xsl] Expanding Ranges

2009-03-19 08:51:41
In XSLT 2.0 if you have the start and end of the range as integers $start
and $end, you can do

<xsl:value-of select="for $i in $start to $end return concat('fig', $i)"/>

In 1.0 you have to do a call on a named template that calls itself
recursively to process each number in the sequence.

Michael Kay
http://www.saxonica.com/

-----Original Message-----
From: Ganesh Babu N [mailto:nbabuganesh(_at_)gmail(_dot_)com] 
Sent: 19 March 2009 12:31
To: XSL
Subject: [xsl] Expanding Ranges

Dear All,

My input is like below: the <cross-ref> tags are not 
continues it will come in between the content.

<links>
<p>some text  <cross-ref><cr refid="MEPRfig2"> 2</cr>-<cr 
refid="MEPRfig4">4</cr></cross-ref> some text <cross-ref><cr 
refid="MEPRfig1">Figures 1</cr> and <cr 
refid="MEPRfig3">3</cr></cross-ref> some text</p>

<p><cross-ref><cr refid="MEPRtbl1">1</cr>-<cr 
refid="MEPRtbl4">4</cr></cross-ref> some text <cross-ref><cr 
refid="MEPRtbl1">Tables 1</cr> and <cr 
refid="MEPRtbl2">2</cr></cross-ref> some text <cross-ref><cr 
refid="MEPRtbl1">Table1</cr></cross-ref> some text </p>

<p>some text <cross-ref><cr refid="MEPRtbl1">1</cr>-<cr 
refid="MEPRtbl3">3</cr> and  <cr refid="MEPRtbl4">4</cr></cross-ref>
some text</p>
</links>

The required output will be like below:

<links>
<p>some text  <cross-refs refid="fig2 fig3 fig4"> 
2-4</cross-refs> some text <cross-refs refid="fig1 
fig3">Figures 1 and 3</cross-refs> some text</p>

<p><cross-refs refid="tbl1 tbl2 tbl3 tbl4">1-4</cross-refs> 
some text <cross-refs refid="tbl1 tbl2">Tables 1 and 
2</cross-refs> some text <cross-ref 
refid="tbl1">Table1</cross-ref> some text </p>

<p>some text <cross-refs refid="tbl1 tbl2 tbl3 tbl4">1-3 and 
4</cross-refs> some text</p> </links>

Here is the XSL which i have tried. I do not know how to 
expand the ranges. My style sheet is combining available 
attributes to single attribute. Please help me in getting 
ranges expanded.

<xsl:template match="cross-ref">
<xsl:choose>
      <xsl:when test="count(cr) = 1">
              <cross-ref refid="{substring-after(cr/@refid,'MEPR')}">
                      <xsl:apply-templates/>
              </cross-ref>
      </xsl:when>
      <xsl:otherwise>
              <cross-refs>
                      <xsl:attribute name="refid">
                              <xsl:for-each select="cr">
                                      <xsl:value-of 
select="substring-after(@refid,'MEPR')"/>
                                      <xsl:if 
test="position() != last()">
                                              <xsl:text> </xsl:text>
                                      </xsl:if>
                              </xsl:for-each>
                      </xsl:attribute>
                      <xsl:apply-templates/>
              </cross-refs>
      </xsl:otherwise>
</xsl:choose>
</xsl:template>

      <xsl:template match="cr">
              <xsl:apply-templates/>
      </xsl:template>

Regards,
Ganesh

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>