perl-XML::LibXML + global external entity loader

Just created a quick patch against perl XML::LibXML module, that adds global external entity loader support. Till now it was only possible to have per instance entity loader, but this is not enough if you want i.e., XML::LibXSLT to also use yours entity loader for imports, and input callbacks doesn’t suit all your needs.

Usage is simple:

XML::LibXML::externalEntityLoader(\&_entity_handler);

where _entity_handler is subroutine like by option ext_ent_handler described in (http://search.cpan.org/dist/XML-LibXML/lib/XML/LibXML/Parser.pod#PARSER_OPTIONS).

Note: when you define global entity loader, per instance entity loader is simply ignored.

You can download this patch  from http://devel.dob.sk/patches/perl-XML::LibXML+global_entity_loader-0.1.diff. Just download XML::LibXML from cpan, patch it and install. I’ll try to push it to CPAN if possible 😉

Solr Pager 0.2.0 released

I’ve just published solr_pager a search component for Solr that should make paging easier. It’s main use should be by XSLT transformation (using XSLT writer), so one should not bother anymore with slow recursive XSLT hacks and only apply fast templates on paging list in search result.

Initial version 0.2.0 can be found on http://devel.dob.sk/solr_pager. Documentation is bundled 😉

I’ve tested it against development version of Solr 1.4, but I think it should works also with currently stable Solr 1.3 (If not let me know, I’ll try to fix it).

How it works:

After install Solr Pager and configuring Solr to use Pager component for results (see README file), one should simply pass pager parameter with number of pager starts that should be generated (pager=10) to search query and list of pager start will be returned in response, smth. like this:

<response>
 <lst name="pager">
 <lst name="pages">  <!-- list of all pages -->
   <int name="2">25</int>
   <int name="3">50</int>
   <int name="4">75</int> <!-- this is actual page -->
   <int name="5">100</int>
   <int name="6">125</int>
   <int name="7">150</int>
   <int name="8">175</int>
   <int name="9">200</int>
   <int name="10">225</int>
   <int name="11">250</int>
 </lst>
 <int name="prev">50</int>  <!-- previous page, with start = 50 -->
 <int name="next">100</int>  <!-- next page, with start = 75 -->
 <int name="last">1225</int> <!-- last page, with start = 1225 -->
 <int name="actual">4</int> <!-- actual page number -->
 <int name="count">49</int> <!-- count of all pages -->
 </lst>
</response>

There is also another parameter pager.pre that sets how many proceeding pager starts should be generated, one pager start will be generated for actual page and all other pages will be pager starts of pages following the actual page.

Name is position of the page starting from 1 and node value is parameter (document position) that should be passed back to solr as value for start parameter.

It’s simple component, so it should have no bugs (HA HA), but if found any plz. report them to me. Also if you have some interesting and usable feature or patch that could be added to Solr Pager, again,don’t be ashamed and let me know.

XSLT – copy node with attributes without childs

Simple solution for not-so-trivial problem of copying xml node with all its attributes, but without child nodes.

Without the last condition, solution is easy, one would use <xsl:copy-of>, but with it things are a bit harder, you should do smt. like:

<xsl:copy select="."> <!-- this copies element name -->
   <xsl:copy-of select="@*"/> <!-- this copies all its attributes -->
   ...what..ever..you..want..here...
</xsl:copy>

And thats all, seems easy but it took me some time to realize it (And I must do it myself, because google didn’t helped me !).