From b8250c1ae217b0e24bc400ce9a063425eb11f84d Mon Sep 17 00:00:00 2001
From: Hammat Wele <hammat.wele@inlibro.com>
Date: Wed, 11 Oct 2023 11:22:15 +0000
Subject: [PATCH] Bug 17385: Add custum export format option to the cart and
 the lists and fix tests for CustomXSLTExportList

---
 C4/XSLT.pm                                    | 11 ++--
 basket/basket.pl                              |  3 +-
 basket/downloadcart.pl                        | 12 ++++-
 catalogue/detail.pl                           |  2 +-
 catalogue/export.pl                           | 18 +++++--
 .../en/includes/virtualshelves-toolbar.inc    |  2 +-
 .../prog/en/modules/basket/basket.tt          |  2 +-
 .../en/includes/opac-detail-sidebar.inc       | 52 +++++++++----------
 .../bootstrap/en/modules/opac-basket.tt       |  8 +++
 .../bootstrap/en/modules/opac-shelves.tt      |  8 +++
 opac/opac-basket.pl                           |  2 +
 opac/opac-detail.pl                           |  3 +-
 opac/opac-downloadcart.pl                     | 12 ++++-
 opac/opac-downloadshelf.pl                    | 16 ++++--
 opac/opac-export.pl                           | 17 ++++--
 opac/opac-shelves.pl                          |  5 +-
 virtualshelves/downloadshelf.pl               | 14 ++++-
 virtualshelves/shelves.pl                     |  2 +-
 18 files changed, 130 insertions(+), 59 deletions(-)

diff --git a/C4/XSLT.pm b/C4/XSLT.pm
index 62df52b8f0..34df696a1e 100644
--- a/C4/XSLT.pm
+++ b/C4/XSLT.pm
@@ -130,24 +130,24 @@ sub get_xslt_sysprefs {
 }
 
 sub get_xsl_filename {
-    my ( $xslsyspref ) = @_;
+    my ( $xslsyspref, $xslfilename ) = @_;
 
     my $lang   = C4::Languages::getlanguage();
 
-    my $xslfilename = C4::Context->preference($xslsyspref) || "default";
+    $xslfilename ||= C4::Context->preference($xslsyspref) || "default";
 
     if ($xslsyspref eq "XSLTCustomExport") {
         my $dir;
         $dir = C4::Context->config('intrahtdocs') .
             '/' . C4::Context->preference("template") .
-            '/' . C4::Languages::getlanguage() .
+            '/' . $lang .
             '/xslt/biblioexport';
         $xslfilename = $dir . "/" . $xslfilename;
     } elsif ($xslsyspref eq "OPACXSLTCustomExport") {
         my $dir;
         $dir = C4::Context->config('opachtdocs') .
             '/' . C4::Context->preference("opacthemes") .
-            '/' . C4::Languages::getlanguage() .
+            '/' . $lang .
             '/xslt/biblioexport';
         $xslfilename = $dir . "/" . $xslfilename;
     } elsif ( $xslfilename =~ /^\s*"?default"?\s*$/i ) {
@@ -208,11 +208,12 @@ sub XSLTParse4Display {
     my $variables    = $params->{xslt_variables};
     my $items_rs     = $params->{items_rs};
     my $interface    = C4::Context->interface;
+    my $xslfilename  = $params->{xslfilename};
 
     die "Mandatory \$params->{xsl_syspref} was not provided, called with biblionumber $params->{biblionumber}"
         if not defined $params->{xsl_syspref};
 
-    my $xslfilename = get_xsl_filename( $xslsyspref);
+    $xslfilename = get_xsl_filename( $xslsyspref, $xslfilename);
 
     my $frameworkcode = GetFrameworkCode($biblionumber) || '';
     my $record_processor = Koha::RecordProcessor->new(
diff --git a/basket/basket.pl b/basket/basket.pl
index a560a4359a..56feed12f6 100755
--- a/basket/basket.pl
+++ b/basket/basket.pl
@@ -27,8 +27,7 @@ use C4::Biblio qw(
 );
 use C4::Auth qw( get_template_and_user );
 use C4::Output qw( output_html_with_http_headers );
-use C4::XSLT;
-
+use C4::XSLT qw( CustomXSLTExportList );
 
 use Koha::AuthorisedValues;
 use Koha::Biblios;
diff --git a/basket/downloadcart.pl b/basket/downloadcart.pl
index 07527e897a..c60a868780 100755
--- a/basket/downloadcart.pl
+++ b/basket/downloadcart.pl
@@ -26,7 +26,7 @@ use C4::Auth qw( get_template_and_user );
 use C4::Output qw( output_html_with_http_headers );
 use C4::Record;
 use C4::Ris qw( marc2ris );
-use C4::XSLT;
+use C4::XSLT qw( XSLTParse4Display );
 
 use Koha::CsvProfiles;
 use Koha::Biblios;
@@ -66,6 +66,7 @@ if ($bib_list && $format) {
 
             my $biblio = Koha::Biblios->find($biblionumber);
             my $record = $biblio->metadata->record({ embed_items => 1 });
+            my $xslFile = $query->param("file");
             next unless $record;
 
             if ($format eq 'iso2709') {
@@ -80,7 +81,14 @@ if ($bib_list && $format) {
                 $output .= marc2bibtex($record, $biblionumber);
             }
             elsif ($format =~ /^xsl\.(.*)$/) {
-                $output .= XSLTParse4Display($biblio, $record, 'XSLTCustomExport', 1, undef, , '', $1, '');
+                $output .= XSLTParse4Display({
+                    biblionumber => $biblio,
+                    record       => $record,
+                    xsl_syspref  => "XSLTCustomExport",
+                    fix_amps     => 1,
+                    hidden_items => undef,
+                    xslfilename  => $xslFile,
+                });
             }
         }
     }
diff --git a/catalogue/detail.pl b/catalogue/detail.pl
index 6e7d864d54..691583a5fb 100755
--- a/catalogue/detail.pl
+++ b/catalogue/detail.pl
@@ -40,7 +40,7 @@ use C4::XISBN qw( get_xisbns );
 use C4::External::Amazon qw( get_amazon_tld );
 use C4::Search qw( z3950_search_args enabled_staff_search_views new_record_from_zebra );
 use C4::Tags qw( get_tags );
-use C4::XSLT qw( XSLTParse4Display );
+use C4::XSLT qw( XSLTParse4Display CustomXSLTExportList );
 use Koha::DateUtils qw( format_sqldatetime );
 use C4::HTML5Media;
 use C4::CourseReserves qw( GetItemCourseReservesInfo );
diff --git a/catalogue/export.pl b/catalogue/export.pl
index e023a55e71..42a7fe663f 100755
--- a/catalogue/export.pl
+++ b/catalogue/export.pl
@@ -7,8 +7,8 @@ use C4::Output;
 use C4::Biblio qw( GetMarcControlnumber );
 use CGI qw ( -utf8 );
 use C4::Ris qw( marc2ris );
-use C4::XSLT;
-
+use C4::XSLT qw( XSLTParse4Display );
+use Koha::Biblios;
 
 
 
@@ -92,11 +92,21 @@ if ($op eq "export") {
     my $biblionumber = $query->param("bib");
     if ($biblionumber){
         my $xslFile = $query->param("file");
-        my $marc = GetMarcBiblio( { biblionumber => $biblionumber, embed_items => 1 } );
+        my $biblio = Koha::Biblios->find($biblionumber);
+        my $marc = $biblio->metadata->record( { embed_items => 1 } );
         my $format=$query->param("format")||'txt';
         my @hiddenitems;
 
-        $marc = XSLTParse4Display($biblionumber, $marc, 'XSLTCustomExport', 1, \@hiddenitems, '', $xslFile,'');
+        $marc = XSLTParse4Display(
+            {
+                biblionumber   => $biblionumber,
+                record         => $marc,
+                xsl_syspref    => "XSLTCustomExport",
+                fix_amps       => 1,
+                hidden_items   => \@hiddenitems,
+                xslfilename    => $xslFile,
+            }
+        );
         print $query->header(
             -type => 'application/octet-stream',
             -attachment=>"bib-$biblionumber.$format");
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves-toolbar.inc
index 50fb4acc61..b59f4b5770 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves-toolbar.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves-toolbar.inc
@@ -39,7 +39,7 @@
                         <li><a href="/cgi-bin/koha/virtualshelves/downloadshelf.pl?format=[% csv_profile.export_format_id | uri %]&amp;shelfid=[% shelf.shelfnumber | uri %]">CSV - [% csv_profile.profile | html %]</a></li>
                     [% END %]
                     [% FOREACH xsl_export IN xsl_exports %]
-                        <li><a href="/cgi-bin/koha/virtualshelves/downloadshelf.pl?format=xsl.[% xsl_export.value | uri %]&amp;shelfid=[% shelf.shelfnumber | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
+                        <li><a href="/cgi-bin/koha/virtualshelves/downloadshelf.pl?format=xsl.[% xsl_export.value | uri %]&amp;file=[% xsl_export.value | uri %]&amp;shelfid=[% shelf.shelfnumber | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
                     [% END %]
                 </ul>
         </div>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tt
index 2b9d79a83b..5ea09e721a 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tt
@@ -64,7 +64,7 @@
                                 <li><a href="/cgi-bin/koha/basket/downloadcart.pl?format=[% csv_profile.export_format_id | uri %]&amp;bib_list=[% bib_list | uri %]">CSV - [% csv_profile.profile | html %]</a></li>
                             [% END %]
                             [% FOREACH xsl_export IN xsl_exports %]
-                                <li><a href="/cgi-bin/koha/basket/downloadcart.pl?format=xsl.[% xsl_export.value | uri %]&amp;bib_list=[% bib_list | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
+                                <li><a href="/cgi-bin/koha/basket/downloadcart.pl?format=xsl.[% xsl_export.value | uri %]&amp;file=[% xsl_export.value | uri %]&amp;bib_list=[% bib_list | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
                             [% END %]
                             </ul>
                         </div>
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc
index 770736a609..b833e2c1ae 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc
@@ -66,36 +66,34 @@
         <li>
             <div id="export">
                 <div class="dropdown">
-                    <a id="format" class="btn btn-link btn-lg dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-fw fa-download"></i> Save record <b class="caret"></b></a>
-                        <ul class="dropdown-menu pull-left" role="menu" aria-labelledby="format">
-                            [% FOREACH option IN export_options %]
-                                [% IF option == 'dc' %]
-                                    <li><a role="menuitem" href="#" data-toggle="modal" data-target="#exportModal_">Dublin Core</a></li>
-                                [% ELSIF option != 'custom' %]
-                                <li>
-                                    <a role="menuitem" href="/cgi-bin/koha/opac-export.pl?op=export&amp;bib=[% biblio.biblionumber | html %]&amp;format=[% option | html %]">
-                                        [% SWITCH option %]
-                                            [% CASE 'bibtex' %]BIBTEX
-                                            [% CASE 'endnote' %]EndNote
-                                            [% CASE 'marcxml' %]MARCXML
-                                            [% CASE 'marc8' %]MARC (non-Unicode/MARC-8)
-                                            [% CASE 'utf8' %]MARC (Unicode/UTF-8)
-                                            [% CASE 'marcstd' %]MARC (Unicode/UTF-8, Standard)
-                                            [% CASE 'mods' %]MODS (XML)
-                                            [% CASE 'ris' %]RIS
-                                            [% CASE 'isbd' %]ISBD
-                                        [% END %]
-                                    </a>
-                                </li>
-                                [% ELSE %]
-                                    [% FOREACH filesOption IN filesOptions %]
-                                        <li><a role="menuitem" href="/cgi-bin/koha/opac-export.pl?format=[% filesOption.format | html %]&amp;op=exportxsl&amp;file=[% filesOption.value | html %]&amp;bib=[% biblionumber | html %]">XSL - [% filesOption.filename | html %]</a></li>
+                    <a id="format" class="btn btn-link btn-lg dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-fw fa-download" aria-hidden="true"></i> Save record <b class="caret"></b></a>
+                    <div class="dropdown-menu dropdown-menu-right" aria-labelledby="format">
+                        [% FOREACH option IN export_options %]
+                            [% IF option == 'dc' %]
+                                <a class="dropdown-item" href="#" data-toggle="modal" data-target="#exportModal_">Dublin Core</a>
+                            [% ELSIF option != 'custom' %]
+                                <a class="dropdown-item" href="/cgi-bin/koha/opac-export.pl?op=export&amp;bib=[% biblio.biblionumber | html %]&amp;format=[% option | html %]">
+                                    [% SWITCH option %]
+                                        [% CASE 'bibtex' %]<span>BIBTEX</span>
+                                        [% CASE 'endnote' %]<span>EndNote</span>
+                                        [% CASE 'marcxml' %]<span>MARCXML</span>
+                                        [% CASE 'marc8' %]<span>MARC (non-Unicode/MARC-8)</span>
+                                        [% CASE 'utf8' %]<span>MARC (Unicode/UTF-8)</span>
+                                        [% CASE 'marcstd' %]<span>MARC (Unicode/UTF-8, Standard)</span>
+                                        [% CASE 'mods' %]<span>MODS (XML)</span>
+                                        [% CASE 'ris' %]<span>RIS</span>
+                                        [% CASE 'isbd' %]<span>ISBD</span>
                                     [% END %]
+                                </a>
+                            [% ELSE %]
+                                [% FOREACH filesOption IN filesOptions %]
+                                    <a href="/cgi-bin/koha/opac-export.pl?format=[% filesOption.format | html %]&amp;op=exportxsl&amp;file=[% filesOption.value | html %]&amp;bib=[% biblionumber | html %]" >XSL - [% filesOption.filename | html %]</a>
                                 [% END %]
                             [% END %]
-                        </ul>
-                </div>
-            </div>
+                        [% END %]
+                    </div> <!-- /.dropdown-menu -->
+                </div> <!-- /.dropdown -->
+            </div> <!-- /#export -->
         </li>
     [% END %]
 
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-basket.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-basket.tt
index 7ba7bb4513..076936bf51 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-basket.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-basket.tt
@@ -30,6 +30,7 @@
                                     <a class="btn btn-link btn-sm send" href="opac-basket.pl"><i class="fa fa-fw fa-envelope" aria-hidden="true"></i> Send</a>
                                 [% END %]
 
+                                [% SET export_options = Koha.Preference('OpacExportOptions').split(',') %]
                                 <div id="download-cart" class="btn-group dropdown">
                                     <a id="format" class="btn btn-link dropdown-toggle" aria-haspopup="menu" aria-label="Select format and download cart" data-toggle="dropdown" role="button" href="#"><i class="fa fa-fw fa-download" aria-hidden="true"></i> Download <b class="caret"></b></a>
                                     <div class="dropdown-menu" role="menu" aria-labelledby="format">
@@ -40,6 +41,13 @@
                                         [% FOREACH csv_profile IN csv_profiles %]
                                             <a role="menuitem" class="dropdown-item download-cart" data-format="[% csv_profile.export_format_id | html %]" href="#">CSV - [% csv_profile.profile | html %]</a>
                                         [% END %]
+                                        [% FOREACH option IN export_options %]
+                                            [% IF option == 'custom' %]
+                                                [% FOREACH xsl_export IN xsl_exports %]
+                                                    <a role="menuitem" class="dropdown-item" href="/cgi-bin/koha/opac-downloadcart.pl?format=xsl.[% xsl_export.value | uri %]&amp;file=[% xsl_export.value | uri %]&amp;bib_list=[% bib_list | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
+                                                [% END %]
+                                            [% END %]
+                                        [% END %]
                                     </div>
                                 </div>
 
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
index 78c3c1de65..fe3eaea6f6 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
@@ -223,6 +223,7 @@
                                     <div class="list-actions">
                                         <a class="btn btn-link newshelf" href="/cgi-bin/koha/opac-shelves.pl?op=add_form"><i class="fa fa-fw fa-plus" aria-hidden="true"></i> New list</a> <span class="sep">|</span>
 
+                                        [% SET export_options = Koha.Preference('OpacExportOptions').split(',') %]
                                         <div id="download-list" class="btn-group dropdown">
                                             <a id="format" class="btn btn-link dropdown-toggle" aria-haspopup="menu" aria-label="Select format and download list" data-toggle="dropdown" href="/cgi-bin/koha/opac-downloadshelf.pl?shelfnumber=[% shelf.shelfnumber | html %]"><i class="fa fa-fw fa-download" aria-hidden="true"></i> Download <b class="caret"></b></a>
                                             <div class="dropdown-menu pull-left" role="menu" aria-labelledby="format">
@@ -233,6 +234,13 @@
                                                 [% FOREACH csv_profile IN csv_profiles %]
                                                     <a role="menuitem" class="dropdown-item download-list" data-format="[% csv_profile.export_format_id | html %]" href="#">CSV - [% csv_profile.profile | html %]</a>
                                                 [% END %]
+                                                [% FOREACH option IN export_options %]
+                                                    [% IF option == 'custom' %]
+                                                        [% FOREACH xsl_export IN xsl_exports %]
+                                                            <a role="menuitem" class="dropdown-item" href="/cgi-bin/koha/opac-downloadshelf.pl?format=xsl.[% xsl_export.value | uri %]&amp;file=[% xsl_export.value | uri %]&amp;shelfnumber=[% shelf.shelfnumber | uri %]">XSL - [% xsl_export.filename | html %]</a></li>
+                                                        [% END %]
+                                                    [% END %]
+                                                [% END %]
                                             </div>
                                         </div>
 
diff --git a/opac/opac-basket.pl b/opac/opac-basket.pl
index e4ed044a85..7d010f76db 100755
--- a/opac/opac-basket.pl
+++ b/opac/opac-basket.pl
@@ -28,6 +28,7 @@ use C4::Biblio qw(
 );
 use C4::Auth qw( get_template_and_user );
 use C4::Output qw( output_html_with_http_headers );
+use C4::XSLT qw( CustomXSLTExportList );
 use Koha::RecordProcessor;
 use Koha::CsvProfiles;
 use Koha::AuthorisedValues;
@@ -134,6 +135,7 @@ $template->param(
         { type => 'marc', used_for => 'export_records', staff_only => 0 } ),
     bib_list => $bib_list,
     BIBLIO_RESULTS => $resultsarray,
+    xsl_exports => CustomXSLTExportList(),
 );
 
 output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 };
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index eafa4a0d1b..00f49a691e 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -58,7 +58,7 @@ use C4::External::Syndetics qw(
     get_syndetics_toc
 );
 use C4::Members;
-use C4::XSLT qw( XSLTParse4Display );
+use C4::XSLT qw( XSLTParse4Display CustomXSLTExportList );
 use C4::ShelfBrowser qw( GetNearbyItems );
 use C4::Reserves qw( GetReserveStatus IsAvailableForItemLevelRequest );
 use C4::Charset qw( SetUTF8Flag );
@@ -103,7 +103,6 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
     }
 );
 
-#### ADD CUSTOM XSLT
 $template->param(filesOptions => CustomXSLTExportList(1));
 
 my $patron = Koha::Patrons->find( $borrowernumber );
diff --git a/opac/opac-downloadcart.pl b/opac/opac-downloadcart.pl
index e16204c53b..ad3ddd1bad 100755
--- a/opac/opac-downloadcart.pl
+++ b/opac/opac-downloadcart.pl
@@ -28,7 +28,7 @@ use C4::Output qw( output_html_with_http_headers );
 use C4::Record;
 use C4::Ris qw( marc2ris );
 use Koha::Biblios;
-use C4::XSLT;
+use C4::XSLT qw( XSLTParse4Display );
 
 use Koha::CsvProfiles;
 use Koha::RecordProcessor;
@@ -86,6 +86,7 @@ if ($bib_list && $format) {
                     patron      => $patron,
                 }
             );
+            my $xslFile = $query->param("file");
             my $framework = &GetFrameworkCode( $biblio );
             $record_processor->options({
                 interface => 'opac',
@@ -117,7 +118,14 @@ if ($bib_list && $format) {
                 $type      = "text/plain";
             }
             elsif ($format =~ /^xsl\.(.*)$/) {
-                $output .= XSLTParse4Display($biblio, $record, 'OPACXSLTCustomExport', 1, undef, undef, $1, '');
+                $output .= XSLTParse4Display({
+                    biblionumber   => $biblio,
+                    record         => $record,
+                    xsl_syspref    => "OPACXSLTCustomExport",
+                    fix_amps       => 1,
+                    hidden_items => undef,
+                    xslfilename  => $xslFile,
+                });
             }
         }
     }
diff --git a/opac/opac-downloadshelf.pl b/opac/opac-downloadshelf.pl
index eb7e739c04..615517901d 100755
--- a/opac/opac-downloadshelf.pl
+++ b/opac/opac-downloadshelf.pl
@@ -27,7 +27,7 @@ use C4::Output qw( output_html_with_http_headers );
 use C4::Record;
 use C4::Ris qw( marc2ris );
 use Koha::Biblios;
-use C4::XSLT;
+use C4::XSLT qw( XSLTParse4Display );
 
 use Koha::CsvProfiles;
 use Koha::RecordProcessor;
@@ -99,6 +99,7 @@ if ( $shelf and $shelf->can_be_viewed( $borrowernumber ) ) {
                         patron      => $patron,
                     }
                 );
+                my $xslFile = $query->param("file");
                 my $framework = $biblio->frameworkcode;
                 $record_processor->options({
                     interface => 'opac',
@@ -125,8 +126,17 @@ if ( $shelf and $shelf->can_be_viewed( $borrowernumber ) ) {
                     $extension = "txt";
                     $type      = "text/plain";
                 }elsif ($format =~ /^xsl\.(.*)$/){
-                         $output .= XSLTParse4Display($biblionumber, $record, 'XSLTCustomExport', 1, undef, undef, $1, '', 1);
-                    }
+                    $output .= XSLTParse4Display(
+                        {
+                            biblionumber => $biblionumber,
+                            record => $record,
+                            xsl_syspref  => "XSLTCustomExport",
+                            fix_amps  => 1,
+                            hidden_items => undef,
+                            xslfilename  => $xslFile,
+                        }
+                    );
+                }
             }
         }
 
diff --git a/opac/opac-export.pl b/opac/opac-export.pl
index 610d5d27e5..845a6fe656 100755
--- a/opac/opac-export.pl
+++ b/opac/opac-export.pl
@@ -31,8 +31,7 @@ use CGI qw ( -utf8 );
 use C4::Auth;
 use C4::Ris qw( marc2ris );
 use Koha::Biblios;
-use C4::XSLT;
-
+use C4::XSLT qw( XSLTParse4Display );
 use Koha::RecordProcessor;
 
 my $query = CGI->new;
@@ -142,10 +141,20 @@ elsif ( $format =~ /isbd/ ) {
 elsif ($format =~ /html/ ) {
     if ($biblionumber){
         my $xslFile = $query->param("file");
-        $marc = C4::Biblio::GetMarcBiblio({biblionumber => $biblionumber});
+        my $biblio = Koha::Biblios->find($biblionumber);
+        $marc = $biblio->metadata->record;
         my @hiddenitems;
 
-        $marc = XSLTParse4Display($biblionumber, $marc, 'OPACXSLTCustomExport', 1, \@hiddenitems, undef, $xslFile, undef);
+        $marc = XSLTParse4Display(
+            {
+                biblionumber => $biblionumber,
+                record => $marc,
+                xsl_syspref  => "OPACXSLTCustomExport",
+                fix_amps  => 1,
+                hidden_items => \@hiddenitems,
+                xslfilename    => $xslFile,
+            }
+        );
     }
 }
 else {
diff --git a/opac/opac-shelves.pl b/opac/opac-shelves.pl
index 5cecfc7b96..4c56b8d3fc 100755
--- a/opac/opac-shelves.pl
+++ b/opac/opac-shelves.pl
@@ -32,7 +32,7 @@ use C4::Koha qw(
 use C4::Members;
 use C4::Output qw( pagination_bar output_with_http_headers );
 use C4::Tags qw( get_tags );
-use C4::XSLT qw( XSLTParse4Display );
+use C4::XSLT qw( XSLTParse4Display CustomXSLTExportList );
 
 use Koha::Biblios;
 use Koha::Biblioitems;
@@ -503,7 +503,8 @@ $template->param(
     print         => scalar $query->param('print') || 0,
     listsview     => 1,
     staffuser     => $staffuser,
-    permitteduser => $permitteduser
+    permitteduser => $permitteduser,
+    xsl_exports => CustomXSLTExportList()
 );
 
 my $content_type = $query->param('rss')? 'rss' : 'html';
diff --git a/virtualshelves/downloadshelf.pl b/virtualshelves/downloadshelf.pl
index d9939c5cb0..08ab34b185 100755
--- a/virtualshelves/downloadshelf.pl
+++ b/virtualshelves/downloadshelf.pl
@@ -25,7 +25,7 @@ use C4::Auth qw( get_template_and_user );
 use C4::Output qw( output_html_with_http_headers );
 use C4::Record;
 use C4::Ris qw( marc2ris );
-use C4::XSLT;
+use C4::XSLT qw( XSLTParse4Display );
 
 
 use Koha::Biblios;
@@ -72,6 +72,7 @@ if ($shelfid && $format) {
                     my $biblionumber = $content->biblionumber;
                     my $biblio = Koha::Biblios->find($biblionumber);
                     my $record = $biblio->metadata->record({ embed_items => 1 });
+                    my $xslFile = $query->param("file");
                     if ($format eq 'iso2709') {
                         $output .= $record->as_usmarc();
                     }
@@ -82,7 +83,16 @@ if ($shelfid && $format) {
                         $output .= marc2bibtex($record, $biblionumber);
                     }
                     elsif ($format =~ /^xsl\.(.*)$/){
-                        $output .= XSLTParse4Display($biblionumber, $record, 'XSLTCustomExport', 1, undef, ,'',$1,'');
+                        $output .= XSLTParse4Display(
+                            {
+                                biblionumber => $biblionumber,
+                                record => $record,
+                                xsl_syspref  => 'XSLTCustomExport',
+                                fix_amps     => 1,
+                                hidden_items => undef,
+                                xslfilename  => $xslFile,
+                            }
+                        );
                     }
                 }
             }
diff --git a/virtualshelves/shelves.pl b/virtualshelves/shelves.pl
index 7b73df30aa..00c8b44951 100755
--- a/virtualshelves/shelves.pl
+++ b/virtualshelves/shelves.pl
@@ -30,7 +30,7 @@ use C4::Koha qw(
 );
 use C4::Members;
 use C4::Output qw( pagination_bar output_html_with_http_headers output_and_exit_if_error );
-use C4::XSLT qw( XSLTParse4Display );
+use C4::XSLT qw( XSLTParse4Display CustomXSLTExportList );
 
 use Koha::Biblios;
 use Koha::Biblioitems;
-- 
2.34.1