- From: James Clark <jjc@jclark.com>
- Date: Mon, 26 Jun 2000 13:45:54 +0700
- To: Michael Holder <holderm@tusc.com>
- CC: xsl-editors@w3.org
Why don't you use generate-id()?
> Michael Holder wrote:
>
> I think it would be a useful enhancement if there were a way to
> generate sequential numbers using the xsl:number construct. In my
> application I am applying a template to all the PCDATA that searches
> it for any characters matching an input parameter SearchText. If
> there is a match the template should highlight the text that matches
> (it's an html stylesheet) and also create an anchor tag within the
> html output. I implemented it as follows:
>
> <!--
> template for how to present any element that we
> allow searches on... Number, Quantity, Description, Date
> -->
> <xsl:template name="SearchElement">
> <xsl:variable name="LowerDot">
> <xsl:value-of select="translate(.
> , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
> , 'abcdefghijklmnopqrstuvwxyz')"/>
> </xsl:variable>
>
> <xsl:choose>
> <xsl:when test="contains($LowerDot
> , $SearchText) ='true'
> and $SearchText != ''
> and $LowerDot != ''">
> <xsl:variable name="StartPosition">
> <xsl:value-of
> select="string-length(substring-before($LowerDot
> , $SearchText))
> + 1"/>
> </xsl:variable>
>
> <xsl:variable name="AfterLen">
> <xsl:value-of select="string-length(substring-after($LowerDot
> ,
> $SearchText))"/>
> </xsl:variable>
>
> <xsl:value-of select="substring(., 0, $StartPosition)"/>
> <A name="M{$AnchorNumber}">
> <B style="color:#000000;background-color:#ffff66">
> <xsl:value-of select="substring(., $StartPosition
> , string-length($SearchText))"/>
> </B>
> </A>
> <xsl:value-of select="substring(.
> , $StartPosition +
> string-length($SearchText)
> , $AfterLen)"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="."/>
> </xsl:otherwise>
> </xsl:choose>
>
> </xsl:template>
> So, if SearchText was 'er' the following PCDATA:
>
> <Description>ABC1234,ERASER,DRY ERS,WHTBRD</Description>
>
> would be output as:
>
> ...
> ABC1234,<A name="M1"><B
> style="color:#000000;background-color:#ffff66">ER</B></A>ASER,DRY
> ERS,WHTBRD
> ...
>
> And subsequent matches could be M2, M3 and so on. Unfortunately, this
> is how I had to implement the calls to the SearchElement template...
>
> <!--
> template for how to present Money
> -->
> <xsl:template match="Money">
> <xsl:choose>
> <!-- the IMPLIED value of currency is USD -->
> <xsl:when test="@currency='USD' or not(@currency)">
> <xsl:text>$ </xsl:text>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="@currency"/>
> </xsl:otherwise>
> </xsl:choose>
> <xsl:call-template name="SearchElement">
> <xsl:with-param name="AnchorNumber">
> <xsl:number level="any" count="*" grouping-separator=" "
> grouping-size="10000"/>
> </xsl:with-param>
> </xsl:call-template>
> </xsl:template>
>
> <!--
> template for how to present any element that we
> allow searches on... Number, Quantity, Description, Date
> -->
> <xsl:template match="*">
> <xsl:call-template name="SearchElement">
> <xsl:with-param name="AnchorNumber">
> <xsl:number level="any" count="*" grouping-separator=" "
> grouping-size="10000"/>
> </xsl:with-param>
> </xsl:call-template>
> </xsl:template>
>
> I had to use <xsl:number level="any" count="*" ...> to get unique
> values for my AnchorNumber parameter. And, I had to replicate this in
> both places from which I called SearchElement.
>
> While this does give unique values for AnchorNumber they typically
> look like M37, M99, M116, M117, M176 etc... In our application it
> would be cleaner if we could generate the html and then set the frame
> for online viewing of the xml doc to {url-of html-output}#M1 and then
> the < > buttons in our navigation frame could switch it to #M2, #M3
> etc... Instead we must build a list from the resulting html output.
> So what I am proposing is that in the SearchElement template we
> generate the numbers within the xsl:choose when we decide to mark
> something up as follows:
>
> <xsl:choose>
> <xsl:when test="contains($LowerDot
> , $SearchText) ='true'
> and $SearchText != ''
> and $LowerDot != ''">
> <xsl:variable name="StartPosition">
> <xsl:value-of
> select="string-length(substring-before($LowerDot
> , $SearchText))
> + 1"/>
> </xsl:variable>
>
> <xsl:variable name="AfterLen">
> <xsl:value-of select="string-length(substring-after($LowerDot
> ,
> $SearchText))"/>
> </xsl:variable>
>
> <xsl:value-of select="substring(., 0, $StartPosition)"/>
> <xsl:variable name="AnchorNumber>
> <xsl:number sequence-name="foo" value="++foo"/>
> </xsl:variable>
>
> <A name="M{$AnchorNumber}">
> <B style="color:#000000;background-color:#ffff66">
> <xsl:value-of select="substring(., $StartPosition
> , string-length($SearchText))"/>
> </B>
> </A>
> <xsl:value-of select="substring(.
> , $StartPosition +
> string-length($SearchText)
> , $AfterLen)"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="."/>
> </xsl:otherwise>
> </xsl:choose>
>
> Of course it might work well if sequence-name="foo" value="+1" were
> allowed. It would be my expectation that the foo sequence-name would
> only have scope within the SearchElement template so you would have to
> output it with an xsl:with-param construct if you needed to do so.
>
> Since the logic for numbering the anchors is in the SearchElement
> template where you do the matching you the simplify the call as:
>
> <xsl:call-template name="SearchElement"/>
>
> As before, I hope this was helpful (and not too long) and please let
> me know what you think.
>
> - Mike
Received on Monday, 26 June 2000 02:53:48 UTC