xsl-list
[Top] [All Lists]

Re: word search a document and eliminate duplicate results

2005-01-09 02:40:24
hi,

The search term ($target1) may appear within a <p>, within a <note>, or within a <p> that is within a <note>. If it occurs anywhere within a note, then I need not only the note but the paragraph in which it resides. Which further muddies the water because if a paragraph contains the search term and that same paragraph also contains a <note> that contains the search term, I still need to output that paragraph only once.

The problem is caused by this template:

<xsl:template match="text()" mode="search">
    <xsl:param name="term" select="''"/>
    <xsl:param name="element" select="''"/>
        <xsl:choose>
            <xsl:when test="contains(.,$term)">
                <xsl:for-each select="ancestor::p[not(parent::note)][1]">
                    <xsl:apply-templates/>
                    <hr/><br/>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise/>
        </xsl:choose>
</xsl:template>

It makes a textual copy of its container for each and every text node that contains the searched text. You could add an expression to the 'xsl:when' that is only true at the first match:

<xsl:template match="text()" mode="search">
   <xsl:param name="term" select="''"/>
   <xsl:param name="element" select="''"/>
       <xsl:choose>
<xsl:when test="contains(.,$term) and generate-id()=generate-id(ancestor::p[not(parent::note)][1]//text()[contains(.,$term)])"> <xsl:apply-templates select="ancestor::p[not(parent::note)][1]"/>
                   <hr/><br/>
           </xsl:when>
           <xsl:otherwise/>
       </xsl:choose>
</xsl:template>


You might also avoid the duplication by copying at the top rather than after diving in the tree. e.g.:

<xsl:template match="/">
<div>
<xsl:for-each select="/*/*[local-name()=document('')/*/xsl:variable[(_at_)name='select-elements']/item][contains(.,$target1)]">
                <xsl:copy-of select="."/>
                <hr/>
        </xsl:for-each>
</div>
</xsl:template>



regards,
--
Joris Gillis (http://www.ticalc.org/cgi-bin/acct-view.cgi?userid=38041)
Vincit omnia simplicitas
Keep it simple

--~------------------------------------------------------------------
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>