[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: multiple range expansion

Subject: Re: multiple range expansion
From: Ganesh Babu N <nbabuganesh@xxxxxxxxx>
Date: Tue, 23 Jun 2009 11:22:18 +0530
Re:  multiple range expansion
Thanks Ken,

I got the concept and converted successfully. Instead of for-each i
have used for to get spaces between ids. But one place i am unable to
remove. Please help to achieve this.

Input:

<cross-ref>[<cr refid="MEP_L_bib5">5</cr>-<cr
refid="MEP_L_bib7">7</cr>, <cr refid="MEP_L_bib21">21</cr>-<cr
refid="MEP_L_bib24">24</cr>]</cross-ref>

correct output:
<cross-refs refid="bib5 bib6 bib7 bib21 bib22 bib23 bib24">[5-7,
21-24]</cross-refs>

Output from modified XSL:
<cross-refs refid="bib5 bib6 bib7bib21 bib22 bib23 bib24">[5-7,
21-24]</cross-refs>

Modified XSL code:
<xsl:analyze-string select="." regex="(\d+)(\s*-\s*(\d+))?">
  <xsl:matching-substring>
     <xsl:value-of select="for $i in xs:integer(regex-group(1)) to
(if(regex-group(3)) then xs:integer(regex-group(3)) else
xs:integer(regex-group(1))) return concat('bib', $i)"/>
   </xsl:matching-substring>
</xsl:analyze-string>

Please suggest. bib7 and bib21 has to be separated.

Regards,
Ganesh


On Mon, Jun 22, 2009 at 5:46 PM, G. Ken
Holman<gkholman@xxxxxxxxxxxxxxxxxxxx> wrote:
> At 2009-06-22 14:11 +0530, Ganesh Babu N wrote:
>>
>> I am having the following inputs:
>>
>> 1. <cross-ref>[<cr refid="MEP_L_bib5">5</cr>-<cr
>> refid="MEP_L_bib7">7</cr>, <cr refid="MEP_L_bib21">21</cr>-<cr
>> refid="MEP_L_bib24">24</cr>]</cross-ref>
>>
>> 2. <cross-ref>[<cr refid="MEP_L_bib2">2</cr>,<cr
>> refid="MEP_L_bib4">4</cr>]</cross-ref>
>>
>> 3. <cross-ref>[<cr refid="MEP_L_bib5">5</cr>-<cr
>> refid="MEP_L_bib7">7</cr>]</cross-ref>
>>
>> the required output is as follows:
>>
>> 1. <cross-refs refid="bib5 bib6 bib7 bib21 bib22 bib23 bib24">[5-7,
>> 21-24]</cross-refs>
>>
>> 2. <cross-refs refid="bib2 bib4">[2,  4]</cross-refs>
>>
>> 3.  <cross-refs refid="bib5 bib6 bib7">[5-7]</cross-refs>
>>
>> I have tried this with the following code:
>>
>> <xsl:template match="cross-ref">
>> <xsl:choose>
>> <xsl:when test="contains(.,'-')">
>>   <ce:cross-refs>
>>     <xsl:attribute name="refid">
>>         <xsl:if test="cr/@refid[contains(., 'bib')]">
>>              <xsl:variable name="start"
>> select="cr[following-sibling::text()[1] =
>> '-']/@refid/xs:integer(substring-after(.,'MEP_L_bib'))"/>
>
> Your variable's value is not a singleton ... you will get as many start
> points as you have ranges.  You are not working through your value in a
> piecemeal manner handling one range at a time.
>
>> When I execute the above code i am getting the following error:
>>
>>  XPTY0004: A sequence of more than one item is not allowed as the
>> first operand of 'to' (5, 21)
>
> Right ... because the sibling axis is grabbing all starts of ranges.
>
>> I have tried with
>>
>> <xsl:for-each select="$start and $end">
>>     <xsl:value-of select="for $i in $start to $end return concat('bib',
>> $i)"/>
>> </xsl:for-each>
>>
>> Even this also not working.
>
> Now you are just guessing instead of considering the root of your problem
of
> not working with singleton values.  The error message was clear, yet you
are
> still trying to work with the improperly-structured first operand.
>  Moreover, the "and" operator is a boolean operator, thus "$start and $end"
> is a boolean value of true/false and since both operands are non-zero
> numbers or non-empty strings, the value will always be true.
>
> In the code below, I am using <xsl:analyze-string> to give me an
opportunity
> to work with each of the page ranges one at a time.  I am making the
> assumption that the #PCDATA text matches the attribute values, thus I can
do
> the work without looking inside of the attributes.
>
> Note that with <xsl:analyze-string> one gets the opportunity to describe a
> match pattern where each range is dealt with one at a time, thus the "to"
> operator can work with singleton operands.
>
> I hope this helps.
>
> . . . . . . . . . . . Ken
>
> T:\ftemp>type ganesh.xml
> <tests>
> 1. <cross-ref>[<cr refid="MEP_L_bib5">5</cr>-<cr
> refid="MEP_L_bib7">7</cr>, <cr refid="MEP_L_bib21">21</cr>-<cr
> refid="MEP_L_bib24">24</cr>]</cross-ref>
>
> 2. <cross-ref>[<cr refid="MEP_L_bib2">2</cr>,<cr
> refid="MEP_L_bib4">4</cr>]</cross-ref>
>
> 3. <cross-ref>[<cr refid="MEP_L_bib5">5</cr>-<cr
> refid="MEP_L_bib7">7</cr>]</cross-ref>
> </tests>
> T:\ftemp>call xslt2 ganesh.xml ganesh.xsl
> <?xml version="1.0" encoding="UTF-8"?>
> <tests>
> 1. <cross-refs refid="bib5 bib6 bib7 bib21 bib22 bib23 bib24 ">[5-7,
> 21-24]</cross-refs>
>
> 2. <cross-refs refid="bib2 bib4 ">[2,4]</cross-refs>
>
> 3. <cross-refs refid="bib5 bib6 bib7 ">[5-7]</cross-refs>
> </tests>
> T:\ftemp>type ganesh.xsl
> <?xml version="1.0" encoding="US-ASCII"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>                exclude-result-prefixes="xsd"
>                version="2.0">
>
> <xsl:output indent="yes"/>
>
> <xsl:template match="cross-ref">
>  <cross-refs>
>    <xsl:attribute name="refid">
>      <xsl:analyze-string select="." regex="(\d+)(\s*-\s*(\d+))?">
>        <xsl:matching-substring>
>          <xsl:for-each select="xsd:integer(regex-group(1)) to
>                        (if(regex-group(3)) then xsd:integer(regex-group(3))
>                                            else
> xsd:integer(regex-group(1)))">
>            <xsl:value-of select="concat('bib',.,' ')"/>
>          </xsl:for-each>
>        </xsl:matching-substring>
>      </xsl:analyze-string>
>    </xsl:attribute>
>    <xsl:value-of select="."/>
>  </cross-refs>
> </xsl:template>
>
> <xsl:template match="@*|node()"><!--identity for all other nodes-->
>  <xsl:copy>
>    <xsl:apply-templates select="@*|node()"/>
>  </xsl:copy>
> </xsl:template>
>
> </xsl:stylesheet>
> T:\ftemp>rem Done!
>
>
>
> --
> Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
> Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
> Video lesson:    http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
> Video overview:  http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
> G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
> Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
> Legal business disclaimers:  http://www.CraneSoftwrights.com/legal

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.