Bug 11083: Add ability to generate authority summary using XSLT

This patch only affects authority search results in the staff interface.
It adds a new system preference AuthorityXSLTResultsDisplay. If set,
each authority search result MARCXML will be transformed using the XSLT
at the given filename or URL. The output will be displayed in place of
the default summary.
If errors occur, the XSLT is ignored and the default summary is
displayed.

The syspref value can contain {langcode} and {authtypecode} which will
be replaced by the appropriate value (resp. current language and
authority type code)

Test plan:
1. Apply patch and run updatedatabase
2. Verify that authority search results are not affected yet.
3. Create an XSLT file (for instance in
/home/koha/xslt/en/GEOGR_NAME.xsl)
4. Set AuthorityXSLTResultsDisplay syspref value to
/home/koha/xslt/{langcode}/{authtypecode}.xsl
5. Do an authority search that returns GEOGR_NAME results. Verify that
the summary matches what you expect from your XSLT
6. Do an authority search that returns authorities of other types.
Verify that the default summary is displayed.

Example of a minimal XSLT:

<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
 xmlns:marc="http://www.loc.gov/MARC21/slim"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes"/>
  <xsl:template match="marc:record">
    <xsl:element name="div">
      <xsl:attribute name="class">
        <xsl:text>authority-summary</xsl:text>
      </xsl:attribute>
      <xsl:value-of
        select="marc:datafield[@tag='151']/marc:subfield[@code='a']"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
This commit is contained in:
Julian Maurice 2021-06-02 14:20:34 +02:00 committed by Fridolin Somers
parent cd762ddcd2
commit 4978f3d562
5 changed files with 47 additions and 1 deletions

View file

@ -28,11 +28,13 @@ use C4::Auth qw( get_template_and_user );
use C4::Output qw( output_and_exit pagination_bar output_html_with_http_headers );
use C4::AuthoritiesMarc qw( DelAuthority );
use C4::Search::History;
use C4::Languages;
use Koha::Authority::Types;
use Koha::SearchEngine::Search;
use Koha::SearchEngine::QueryBuilder;
use Koha::Token;
use Koha::XSLT::Base;
use Koha::Z3950Servers;
my $query = CGI->new;
@ -173,6 +175,29 @@ if ( $op eq "do_search" ) {
$to = $startfrom * $resultsperpage;
}
my $AuthorityXSLTResultsDisplay = C4::Context->preference('AuthorityXSLTResultsDisplay');
if ($results && $AuthorityXSLTResultsDisplay) {
my $lang = C4::Languages::getlanguage();
foreach my $result (@$results) {
my $authority = Koha::Authorities->find($result->{authid});
next unless $authority;
my $authtypecode = $authority->authtypecode;
my $xsl = $AuthorityXSLTResultsDisplay;
$xsl =~ s/\{langcode\}/$lang/g;
$xsl =~ s/\{authtypecode\}/$authtypecode/g;
my $xslt_engine = Koha::XSLT::Base->new;
my $output = $xslt_engine->transform({ xml => $authority->marcxml, file => $xsl });
if ($xslt_engine->err) {
warn "XSL transformation failed ($xsl): " . $xslt_engine->err;
next;
}
$result->{html} = $output;
}
}
$template->param( result => $results ) if $results;
my $max_result_window = $searcher->max_result_window;

View file

@ -0,0 +1,9 @@
$DBversion = 'XXX';
if (CheckVersion($DBversion)) {
$dbh->do(q{
INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES
('AuthorityXSLTResultsDisplay','','','Enable XSL stylesheet control over authority results page display on intranet','Free')
});
NewVersion($DBversion, '11083', 'Add syspref AuthorityXSLTResultsDisplay');
}

View file

@ -69,6 +69,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
('AuthorityMergeLimit','50',NULL,'Maximum number of biblio records updated immediately when an authority record has been modified.','integer'),
('AuthorityMergeMode','loose','loose|strict','Authority merge mode','Choice'),
('AuthoritySeparator','--','10','Used to separate a list of authorities in a display. Usually --','free'),
('AuthorityXSLTResultsDisplay','','','Enable XSL stylesheet control over authority results page display on intranet','Free'),
('AuthSuccessLog','0',NULL,'If enabled, log successful authentications','YesNo'),
('autoBarcode','OFF','incremental|annual|hbyymmincr|EAN13|OFF','Used to autogenerate a barcode: incremental will be of the form 1, 2, 3; annual of the form 2007-0001, 2007-0002; hbyymmincr of the form HB08010001 where HB=Home Branch','Choice'),
('AutoCreateAuthorities','0',NULL,'Automatically create authorities that do not exist when cataloging records.','YesNo'),

View file

@ -1,5 +1,10 @@
Staff interface:
Appearance:
-
- 'Display authority results in the staff interface using XSLT stylesheet at: '
- pref: AuthorityXSLTResultsDisplay
class: file
- '<br />Options:<ul><li>Put a path to define a xslt file</li><li>Put an URL for an external specific stylesheet.</li></ul>{langcode} will be replaced with current interface language and {authtypecode} will be replaced by the authority type code'
-
- "Display language selector on "
- pref: StaffLangSelectorMode

View file

@ -57,7 +57,13 @@
</tr>
[% FOREACH resul IN result %]
<tr data-authid="[% resul.authid | html %]">
<td>[% PROCESS authresult summary=resul.summary authid=resul.authid %]</td>
<td>
[% IF resul.html %]
[% resul.html | $raw %]
[% ELSE %]
[% PROCESS authresult summary=resul.summary authid=resul.authid %]
[% END %]
</td>
<td>[% resul.authtype | html %]</td>
[% UNLESS ( resul.isEDITORS ) %]
<td>