View | Details | Raw Unified | Return to bug 40872
Collapse All | Expand All

(-)a/opac/unapi (-41 / +52 lines)
Lines 42-48 use C4::Biblio qw( GetXmlBiblio ); Link Here
42
use Koha::XSLT::Base;
42
use Koha::XSLT::Base;
43
43
44
my $cgi = CGI->new();
44
my $cgi = CGI->new();
45
binmode(STDOUT, ":encoding(UTF-8)"); #output as utf8
45
binmode( STDOUT, ":encoding(UTF-8)" );    #output as utf8
46
46
47
=head1 VARIABLES
47
=head1 VARIABLES
48
48
Lines 52-58 This hashref of hashrefs maps from a MARC flavour and unAPI format Link Here
52
to the stylesheet that should be used to transform the bib MARCXML
52
to the stylesheet that should be used to transform the bib MARCXML
53
to the desired output format.  As new MARC XSLT stylesheets are added,
53
to the desired output format.  As new MARC XSLT stylesheets are added,
54
(particularly for UNIMARC), this map should be updated.  Of course,
54
(particularly for UNIMARC), this map should be updated.  Of course,
55
if/when we add support for emitting a format that is not genreated
55
if/when we add support for emitting a format that is not generated
56
by a stylesheet, the structure of this variable will have to be changed.
56
by a stylesheet, the structure of this variable will have to be changed.
57
At present, this doubles as the list of output formats supported by
57
At present, this doubles as the list of output formats supported by
58
this unAPI implementation.
58
this unAPI implementation.
Lines 90-194 used to describe them in an unAPI format request. Link Here
90
=cut
90
=cut
91
91
92
my $format_info = {
92
my $format_info = {
93
    'marcxml' => q(<format name="marcxml" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
93
    'marcxml' =>
94
    'marcxml-full' => q(<format name="marcxml-full" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
94
        q(<format name="marcxml" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
95
    'mods' => q(<format name="mods" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
95
    'marcxml-full' =>
96
    'mods-full' => q(<format name="mods-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
96
        q(<format name="marcxml-full" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
97
    'mods3' => q(<format name="mods3" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
97
    'mods' =>
98
    'mods3-full' => q(<format name="mods3-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
98
        q(<format name="mods" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
99
    'oai_dc' => q(<format name="oai_dc" type="application/xml" namespace_uri="http://www.openarchives.org/OAI/2.0/oai_dc/" schema_location="http://www.openarchives.org/OAI/2.0/oai_dc.xsd"/>),
99
    'mods-full' =>
100
    'rdfdc' => q(<format name="rdfdc" type="application/xml" namespace_uri="http://purl.org/dc/elements/1.1/" schema_location="http://purl.org/dc/elements/1.1/"/>),
100
        q(<format name="mods-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
101
    'rss2' => q(<format name="rss2" type="application/xml"/>),
101
    'mods3' =>
102
        q(<format name="mods3" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
103
    'mods3-full' =>
104
        q(<format name="mods3-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
105
    'oai_dc' =>
106
        q(<format name="oai_dc" type="application/xml" namespace_uri="http://www.openarchives.org/OAI/2.0/oai_dc/" schema_location="http://www.openarchives.org/OAI/2.0/oai_dc.xsd"/>),
107
    'rdfdc' =>
108
        q(<format name="rdfdc" type="application/xml" namespace_uri="http://purl.org/dc/elements/1.1/" schema_location="http://purl.org/dc/elements/1.1/"/>),
109
    'rss2'      => q(<format name="rss2" type="application/xml"/>),
102
    'rss2-full' => q(<format name="rss2-full" type="application/xml"/>),
110
    'rss2-full' => q(<format name="rss2-full" type="application/xml"/>),
103
    'srw_dc' => q(<format name="srw_dc" type="application/xml" namespace_uri="info:srw/schema/1/dc-schema" schema_location="http://www.loc.gov/z3950/agency/zing/srw/dc-schema.xsd"/>),
111
    'srw_dc'    =>
112
        q(<format name="srw_dc" type="application/xml" namespace_uri="info:srw/schema/1/dc-schema" schema_location="http://www.loc.gov/z3950/agency/zing/srw/dc-schema.xsd"/>),
104
};
113
};
105
114
106
my $id     = $cgi->param('id');
115
my $id     = $cgi->param('id');
107
my $format = $cgi->param('format');
116
my $format = $cgi->param('format');
108
117
109
if (not defined $format) {
118
if ( not defined $format ) {
110
    emit_formats($id, $format_to_stylesheet_map, $format_info, $cgi);
119
    emit_formats( $id, $format_to_stylesheet_map, $format_info, $cgi );
111
} elsif ($id) {
120
} elsif ($id) {
112
121
113
    # koha:biblionumber:0152018484
122
    # koha:biblionumber:0152018484
114
    if ($id =~ /koha:biblionumber:(\d+)/) {
123
    if ( $id =~ /koha:biblionumber:(\d+)/ ) {
115
        my $biblionumber = $1;
124
        my $biblionumber = $1;
116
125
117
        my $content;
126
        my $content;
118
127
119
        my $marcxml = GetXmlBiblio($biblionumber);
128
        my $marcxml = GetXmlBiblio($biblionumber);
120
        unless (defined $marcxml) {
129
        unless ( defined $marcxml ) {
130
121
            # no bib, so 404
131
            # no bib, so 404
122
            print $cgi->header( -status => '404 record not found');
132
            print $cgi->header( -status => '404 record not found' );
123
            exit 0;
133
            exit 0;
124
        }
134
        }
125
135
126
        my $xslt_file = get_xslt_file( $format, $format_to_stylesheet_map, $format_info );
136
        my $xslt_file = get_xslt_file( $format, $format_to_stylesheet_map, $format_info );
127
        unless( defined $xslt_file ) {
137
        unless ( defined $xslt_file ) {
128
            print $cgi->header( -status => '406 invalid format requested' );
138
            print $cgi->header( -status => '406 invalid format requested' );
129
            exit 0;
139
            exit 0;
130
        }
140
        }
131
        my $xslt_engine = Koha::XSLT::Base->new;
141
        my $xslt_engine = Koha::XSLT::Base->new;
132
        $content = $xslt_engine->transform({
142
        $content = $xslt_engine->transform(
133
            xml => $marcxml,
143
            {
134
            file => $xslt_file,
144
                xml  => $marcxml,
135
        });
145
                file => $xslt_file,
136
146
            }
137
        if( !defined $content || $xslt_engine->err ) {
147
        );
148
149
        if ( !defined $content || $xslt_engine->err ) {
138
            print $cgi->header( -status => '500 internal error' );
150
            print $cgi->header( -status => '500 internal error' );
139
            exit 0;
151
            exit 0;
140
        }
152
        }
141
153
142
        print $cgi->header( -type =>'application/xml', -charset => 'UTF-8' );
154
        print $cgi->header( -type => 'application/xml', -charset => 'UTF-8' );
143
        print $content;
155
        print $content;
144
    } else {
156
    } else {
157
145
        # ID is obviously wrong, so 404
158
        # ID is obviously wrong, so 404
146
        print $cgi->header( -status => '404 record not found');
159
        print $cgi->header( -status => '404 record not found' );
147
        exit 0;
160
        exit 0;
148
    }
161
    }
149
} else {
162
} else {
163
150
    # supplied a format but no id - caller is doing it wrong
164
    # supplied a format but no id - caller is doing it wrong
151
    print $cgi->header( -status => '400 bad request - if you specify format, must specify id');
165
    print $cgi->header( -status => '400 bad request - if you specify format, must specify id' );
152
    exit 0;
166
    exit 0;
153
}
167
}
154
168
155
exit 0;
169
exit 0;
156
170
157
sub emit_formats {
171
sub emit_formats {
158
    my ($id, $format_to_stylesheet_map, $format_info, $cgi) = @_;
172
    my ( $id, $format_to_stylesheet_map, $format_info, $cgi ) = @_;
159
173
160
    if (defined $id) {
174
    if ( defined $id ) {
161
        print $cgi->header( -type =>'application/xml', -status => '300 multiple choices' );
175
        print $cgi->header( -type => 'application/xml', -status => '300 multiple choices' );
162
    } else {
176
    } else {
163
        print $cgi->header( -type =>'application/xml', -status => '200 Ok' );
177
        print $cgi->header( -type => 'application/xml', -status => '200 Ok' );
164
    }
178
    }
165
179
166
    print "<?xml version='1.0' encoding='utf-8'  ?>\n";
180
    print "<?xml version='1.0' encoding='utf-8'  ?>\n";
167
    if (defined $id) {
181
    if ( defined $id ) {
168
        print qq(<formats id="$id">\n);
182
        print qq(<formats id="$id">\n);
169
    } else {
183
    } else {
170
        print "<formats>\n";
184
        print "<formats>\n";
171
    }
185
    }
172
186
173
    my $marcflavour = uc(C4::Context->preference('marcflavour'));
187
    my $marcflavour = uc( C4::Context->preference('marcflavour') );
174
    foreach my $format (sort keys %{ $format_to_stylesheet_map->{$marcflavour} }) {
188
    foreach my $format ( sort keys %{ $format_to_stylesheet_map->{$marcflavour} } ) {
175
        print $format_info->{$format}, "\n";
189
        print $format_info->{$format}, "\n";
176
    }
190
    }
177
    print "</formats>\n";
191
    print "</formats>\n";
178
    return;
192
    return;
179
}
193
}
180
194
181
182
sub get_xslt_file {
195
sub get_xslt_file {
183
    my ($format, $format_to_stylesheet_map, $format_info) = @_;
196
    my ( $format, $format_to_stylesheet_map, $format_info ) = @_;
184
    $format = lc $format;
197
    $format = lc $format;
185
198
186
    my $marcflavour = uc(C4::Context->preference('marcflavour'));
199
    my $marcflavour = uc( C4::Context->preference('marcflavour') );
187
    return unless $format_to_stylesheet_map->{$marcflavour}->{$format};
200
    return unless $format_to_stylesheet_map->{$marcflavour}->{$format};
188
201
189
    my $xslt_file = C4::Context->config('intrahtdocs') .
202
    my $xslt_file =
190
                    "/prog/en/xslt/" .
203
        C4::Context->config('intrahtdocs') . "/prog/en/xslt/" . $format_to_stylesheet_map->{$marcflavour}->{$format};
191
                    $format_to_stylesheet_map->{$marcflavour}->{$format};
192
204
193
    return $xslt_file;
205
    return $xslt_file;
194
}
206
}
195
- 

Return to bug 40872