[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Re: AW: AW: global variable and position() once more


Subject: Re: [xsl] Re: AW: AW: global variable and position() once more
From: fe.sola@xxxxxxxxxxxxxx
Date: Tue, 2 Sep 2003 12:53:58 -0400

Hello Dimitre and all,
The algorithm works very well except for what I mentioned in the previous email and it 
was definetely my fault. I have contiguous text nodes with the description that have the 
same list structure, so the xhtml looks like this:

<html> 
  <hr/>   Claims 
  <br/> 
  <br/>   I claim: 
  <br/> 
  <br/>   1. blah blah 
  <br/> 
  <br/>   more blah blah 
  <br/> 
  <br/>   2. blah blah blah 
  <br/> 
  <br/>   more blah blah 
  <br/> 
  <br/>   3. blah blah 
  <br/> 
  <br/>   more blah blah 
  <br/> 
  <br/>   4. blah blah blah 
  <br/> 
  <hr/>   Description 
  <br/>   This is the introduction to the description
  <br/>   1. blah blah 
  <br/> 
  <br/>   more blah blah 
  <br/> 
  <br/>   2. blah blah blah 
 
</html> 

So far what I have on the xslt is:
<xsl:key name="kStart" 
                     match="text()[preceding-sibling::*[1][self::br]]" 
                     use="contains(., '.') 
                     and 
                     number(substring-before(., '.')) 
                     = 
                     number(substring-before(., '.'))"/> 

    <xsl:key name="kTrail" 
                  match="text()[preceding-sibling::*[1][self::br]]" 
                  use="generate-id( 
                            preceding-sibling::text() 
                            [ 
                              contains(., '.') 
                              and 
                              number(substring-before(., '.')) 
                              = 
                              number(substring-before(., '.')) 
                           ] 
                           [1] 
                   )"/> 
<xsl:template match="/html/body">
  <xsl:element name="Claims">
               <xsl:apply-templates select="node()[preceding-sibling::text()[starts-with 
(normalize-space(.), 'Claims')] and following::text()[starts-with(normalize-space
(.), 'Description')]] " mode="claims"/>
  </xsl:element>
</xsl:template>

<xsl:template match="node()[preceding-sibling::text()[starts-with(normalize-space
(.), 'Claims')] and following::text()[starts-with(normalize-space(.), 'Description')]] " 
mode="claims"> 
                   <xsl:for-each select="key('kStart', 'true')"> 
                           <Claim> 
                              <xsl:copy-of select="normalize-space()"/> 
                              <xsl:variable name="vLastNumbered" select="position() = 
last()"/> 
                           <xsl:for-each select="key('kTrail', generate-id())"> 
                                                                                         
                               <xsl:if test="$vLastNumbered or not(position() = last
())"> 
                                                                                         
                                     <xsl:copy-of  select="concat(substring(.,1,1), 
normalize-space(substring(.,2)))"/> 
                                                                                         
                               </xsl:if> 
                            </xsl:for-each> 
                          </Claim> 
                 </xsl:for-each>               
</xsl:template>     


But in the xml output I'm getting the claims alraight except that in the last claim I 
get the fisrt text node of the description included and then starts the description 
list. I know it has to do with:
node()[preceding-sibling::text()[starts-with(normalize-space(.), 'Claims')] and 
following::text()[starts-with(normalize-space(.), 'Description')]] 
I thought this expression would select the text nodes between 'Claims' and 'Description' 
only so I'm still puzzled why it selects nodes after the 'Description' text node...
Thanks a lot for looking at this, 
Lizet 

Mensaje citado por Dimitre Novatchev <dnovatchev@xxxxxxxxx>:


> 
> Here's the corrected code (the key definitions are omitted as they are the
> same:
> 
> <xsl:stylesheet version="1.0"
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> 
>  <xsl:output omit-xml-declaration="yes" indent="yes"/>
>  <xsl:strip-space elements="*"/>
> 
>  <xsl:key name="kStart"
>   match="text()[preceding-sibling::*[1][self::br]]"
>   use="contains(., '.')
>      and
>        number(substring-before(., '.'))
>       =
>        number(substring-before(., '.'))"/>
> 
>   <xsl:key name="kTrail"
>   match="text()[preceding-sibling::*[1][self::br]]"
>    use="generate-id(
>             preceding-sibling::text()
>             [
>              contains(., '.')
>            and
>              number(substring-before(., '.'))
>             =
>              number(substring-before(., '.'))
>             ]
>             [1]
>                    )"/>
> 
>   <xsl:template match="/">
>     <xsl:for-each select="key('kStart', 'true')">
>      <Claim>
>       <xsl:copy-of select="normalize-space()"/>
>       <xsl:variable name="vLastNumbered" select="position() = last()"/>
>       <xsl:for-each select="key('kTrail', generate-id())">
>         <xsl:if test="$vLastNumbered or not(position() = last())">
>           <xsl:copy-of
>            select="concat(substring(.,1,1),
>                           normalize-space(substring(.,2))
>                           )"/>
>         </xsl:if>
>       </xsl:for-each>
>      </Claim>
>     </xsl:for-each>
>   </xsl:template>
> </xsl:stylesheet>
> 
> I believe that two very good books on XSLT are the following:
> 
>   "Beginning XSLT" by Jeni Tennison
> 
>   "XSLT Programmer's Reference" by Michael Kay.
> 
> 
> 
> 
> 
> 
> 
> 
> 
> =====
> Cheers,
> 
> Dimitre Novatchev.
> http://fxsl.sourceforge.net/ -- the home of FXSL
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! SiteBuilder - Free, easy-to-use web site design software
> http://sitebuilder.yahoo.com
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 




-------------------------------------------------
Este mensaje fue enviado usando el servicio de correo en web de Infomed
http://webmail.sld.cu

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords