xsl-list
[Top] [All Lists]

RE: doc() concat expression and whitespace error

2004-11-18 21:51:07
You would get extra flexibility by issuing an "abstract query" from your
stylesheet and using a URIResolver to convert it to a concrete eXist query.

The "abstract query" might be a URI such as

http://query/?citekeys= + $citekeys

which you could parse in your URIResolver using the methods available on the
java.net.URI class.

Then all you would need to get the data from a different source would be a
different URIResolver.

Michael Kay
http://www.saxonica.com/ 

-----Original Message-----
From: Bruce D'Arcus [mailto:bdarcus(_at_)myrealbox(_dot_)com] 
Sent: 18 November 2004 22:44
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] doc() concat expression and whitespace error

On Nov 16, 2004, at 12:02 PM, Bruce D'Arcus wrote:

Can the former be made faster?

The easiest way is instead of sending a single query for each 
distinct-value of the "citekey" key, I somehow send a query 
that asks 
for all of them at once.

I'm not quite sure who to do that, though.  I know that I 
want a "for 
$key in $keys return mods:mods[ID='$key']" sort of 
expression; I just 
don't know how to do that with the key.

OK, we got it working so the stylesheets grab the entire 
collection of 
bibliographic records at once (sort of a PITA with the url 
escaping).  
With a bug fixed in eXist, it seems to be much faster than 
the earlier 
approach.

Does anyone have any feedback on if there is a better, more flexible, 
way to code this?  I'd like to make it easy for people to switch to 
different storage options (flat files and other sorts of 
url-queries in 
particular), probably even with a parameter option.

   <xsl:template match="db:bibliography" mode="create-bibcollection">
      <xsl:variable name="citekeys">
        <xsl:text>(</xsl:text>
        <xsl:for-each select="distinct-values(key('citekey', 'all'))">
          <xsl:if test="position() &gt; 1">,%20</xsl:if>
          <xsl:text>&apos;</xsl:text>
          <xsl:value-of select="."/>
          <xsl:text>&apos;</xsl:text>
        </xsl:for-each>
        <xsl:text>)</xsl:text>
      </xsl:variable>
   <!--+ 
==============================================================
     | bibrecord variable identifies where to locate the bib 
records; in
     | this case, we access them via http from an eXist XML DB
     +-->
      <xsl:variable name="bibrecord"
         
select='doc(concat("http://localhost:8080/exist/servlet/db/biblio?";,
         
"_query=declare%20namespace%20mods=%22http://www.loc.gov/mods/v3%22;";,
         "%20for%20$citekey%20in%20",
         $citekeys,
         
"%20return%20/mods:modsCollection/mods:mods[(_at_)ID=$citekey]"))' />
      <bibliography>
        <modsCollection xmlns="http://www.loc.gov/mods/v3";>
           <xsl:copy-of select="$bibrecord/exist:result/mods:mods" />
       </modsCollection>
     </bibliography>
   </xsl:template>

Bruce


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




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