xsl-list
[Top] [All Lists]

Re: sorting titles w stopwords but w/o value in every title node

2004-09-02 04:33:04
Hi Susan,

I modified the stylesheet to display the titles on first occurence in the table,
This is the output I get now:

    doc-number   title   description   arrival-date
    53690  American Artist  v.68:no.738(2004:Jan.)  02/26/2004
    57769  The American city & country  v.119:no.3(2004:Mar.)  03/25/2004
    57769       v.119:no.1(2004:Jan.)  02/11/2004
    58345  American demographics  v.26:no.3(2004:Apr.)  04/12/2004
    58345       v.26:no.2(2004:Mar.)  03/06/2004
    58345       v.26:no.1(2004:Feb.)  02/05/2004
    58615  Forbes.  v.173:no.5(2004:Mar.15)  03/15/2004
    58615       v.173:no.2(2004:Feb. 02)  01/21/2004
    58615       v.173:no.1(2004:Jan. 12)  01/12/2004

I added a key:

    <xsl:key name="titles" match="//section-02/title[string(.)]" 
use="../doc-number"/>

And then instead of directly writing to the table, I created another global 
variable, 
already sorted, structured like

<output>
    <title doc-number="53690" title="American Artist" 
        description="v.68:no.738(2004:Jan.)" arrival-date="02/26/2004"/>
    <title doc-number="57769" title="The American city &amp; country" 
        description="v.119:no.3(2004:Mar.)" arrival-date="03/25/2004"/>
    <title doc-number="57769" title="The American city &amp; country" 
        description="v.119:no.1(2004:Jan.)" arrival-date="02/11/2004"/>
    <title doc-number="58345" title="American demographics" 
        description="v.26:no.3(2004:Apr.)" arrival-date="04/12/2004"/>
    ...
</output>

where every record has its full title.

Then, when writing the output in the table, I only print the title if it's the 
first
occurence of that doc-number.

<xsl:stylesheet version="1.0"
   xmlns="http://www.w3.org/1999/xhtml";
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   xmlns:exsl="http://exslt.org/common";
   xmlns:sw="http://my.stopwords/sw";
  extension-element-prefixes="exsl sw"
   >

 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
  />

 <sw:stop>
  <sw:word>the</sw:word>
  <sw:word>a</sw:word>
  <sw:word>an</sw:word>
 </sw:stop>

 <xsl:variable name="stop-words" 
select="document('')/xsl:stylesheet/sw:stop/sw:word"/>
 <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
 <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>

 <xsl:key name="titles" match="//section-02/title[string(.)]" 
use="../doc-number"/>

 <xsl:variable name="sort-titles">
  <xsl:for-each select="//section-02">
   <xsl:if test="string(title)">
    <title doc-number="{doc-number}">
     <xsl:variable name="lower-title" select="translate(title, $uppercase, 
$lowercase)"/>
     <xsl:choose>
      <xsl:when test="$stop-words[starts-with($lower-title, concat(translate(., 
$uppercase, $lowercase), ' '))]">
       <xsl:value-of select="substring-after($lower-title,' ')"/>
      </xsl:when>
      <xsl:otherwise>
       <xsl:value-of select="$lower-title"/>
      </xsl:otherwise>
     </xsl:choose>
    </title>
   </xsl:if>
  </xsl:for-each>
 </xsl:variable>

 <xsl:variable name="output">
  <xsl:for-each select="//section-02/title">
   <xsl:sort select="exsl:node-set($sort-titles)/*[(_at_)doc-number = 
current()/../doc-number]"/>
   <xsl:sort select="number(concat(substring(../arrival-date, 7,4),
    substring(../arrival-date, 1,2), substring(../arrival-date, 4,2)))"
    order="descending"/>
   <title doc-number="{../doc-number}" title="{key('titles', ../doc-number)}" 
    description="{../description}" arrival-date="{../arrival-date}"/>
  </xsl:for-each>
 </xsl:variable>

 <xsl:template match="/">
  <html xmlns="http://www.w3.org/1999/xhtml";><head><title>sort without 
stop-words</title></head><body>
   <table border="1">
    <tr>
     <th>doc-number</th>
     <th>title</th>
     <th>description</th>
     <th>arrival-date</th>
    </tr> 
    <xsl:for-each select="exsl:node-set($output)/*">
     <xsl:variable name="title">
      <xsl:if test="not(preceding-sibling::*[(_at_)doc-number = 
current()/@doc-number])">
       <xsl:value-of select="@title"/>
      </xsl:if>
     </xsl:variable>
     <tr>
      <td><xsl:value-of select="@doc-number"/></td>
      <td><xsl:value-of select="$title"/></td>
      <td><xsl:value-of select="@description"/></td>
      <td><xsl:value-of select="@arrival-date"/></td>
     </tr>
    </xsl:for-each>
   </table>
  </body></html>
 </xsl:template>

</xsl:stylesheet>

Cheers,
Anton Triest