2 * Copyright (C) 2005-2007, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: tst_record_conv.c,v 1.13 2007-01-03 08:42:16 adam Exp $
8 #include <yaz/record_conv.h>
10 #include <yaz/wrbuf.h>
13 #include <yaz/libxml2_error.h>
21 #include <libxml/parser.h>
22 #include <libxml/tree.h>
24 yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w)
26 xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring));
29 wrbuf_printf(w, "xmlParseMemory");
34 xmlNodePtr ptr = xmlDocGetRootElement(doc);
35 yaz_record_conv_t p = yaz_record_conv_create();
39 const char *srcdir = getenv("srcdir");
41 yaz_record_conv_set_path(p, srcdir);
45 wrbuf_printf(w, "xmlDocGetRootElement");
46 yaz_record_conv_destroy(p);
51 wrbuf_printf(w, "yaz_record_conv_create");
57 int r = yaz_record_conv_configure(p, ptr);
61 wrbuf_puts(w, yaz_record_conv_get_error(p));
62 yaz_record_conv_destroy(p);
71 int conv_configure_test(const char *xmlstring, const char *expect_error,
72 yaz_record_conv_t *pt)
74 WRBUF w = wrbuf_alloc();
77 yaz_record_conv_t p = conv_configure(xmlstring, w);
81 if (expect_error && !strcmp(wrbuf_buf(w), expect_error))
86 printf("%.*s\n", wrbuf_len(w), wrbuf_buf(w));
101 yaz_record_conv_destroy(p);
107 static void tst_configure(void)
112 YAZ_CHECK(conv_configure_test("<bad", "xmlParseMemory", 0));
115 YAZ_CHECK(conv_configure_test("<backend syntax='usmarc' name='F'>"
117 "Element <backend>: expected <marc> or "
118 "<xslt> element, got <bad>", 0));
121 YAZ_CHECK(conv_configure_test("<backend syntax='usmarc' name='F'>"
122 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
124 " inputcharset=\"marc-8\""
125 " outputcharset=\"marc-8\""
128 "Element <marc>: attribute 'inputformat' "
130 YAZ_CHECK(conv_configure_test("<backend syntax='usmarc' name='F'>"
133 "Element <xslt>: attribute 'stylesheet' "
135 YAZ_CHECK(conv_configure_test("<backend syntax='usmarc' name='F'>"
137 " inputcharset=\"utf-8\""
138 " outputcharset=\"marc-8\""
139 " inputformat=\"xml\""
140 " outputformat=\"marc\""
142 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
146 YAZ_CHECK(conv_configure_test("<backend syntax='usmarc' name='F'>"
147 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
150 " YAZ compiled without XSLT support", 0));
154 static int conv_convert_test(yaz_record_conv_t p,
155 const char *input_record,
156 const char *output_expect_record)
165 WRBUF output_record = wrbuf_alloc();
166 int r = yaz_record_conv_record(p, input_record, strlen(input_record),
170 if (output_expect_record)
172 printf("yaz_record_conv error=%s\n",
173 yaz_record_conv_get_error(p));
181 if (!output_expect_record)
185 else if (strlen(output_expect_record) != wrbuf_len(output_record))
187 int expect_len = strlen(output_expect_record);
189 printf("output_record expect-len=%d got-len=%d\n", expect_len,
190 wrbuf_len(output_record));
191 printf("got-output_record = %.*s\n",
192 wrbuf_len(output_record), wrbuf_buf(output_record));
193 printf("output_expect_record = %s\n",
194 output_expect_record);
196 else if (memcmp(output_expect_record, wrbuf_buf(output_record),
197 strlen(output_expect_record)))
200 printf("got-output_record = %.*s\n",
201 wrbuf_len(output_record), wrbuf_buf(output_record));
202 printf("output_expect_record = %s\n",
203 output_expect_record);
210 wrbuf_free(output_record, 1);
215 static void tst_convert1(void)
217 yaz_record_conv_t p = 0;
218 const char *marcxml_rec =
219 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
220 " <leader>00080nam a22000498a 4500</leader>\n"
221 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
222 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
223 " <subfield code=\"a\"> 11224466 </subfield>\n"
226 const char *iso2709_rec =
227 "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
228 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
229 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
230 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
231 "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
233 YAZ_CHECK(conv_configure_test("<backend>"
235 " inputcharset=\"utf-8\""
236 " outputcharset=\"marc-8\""
237 " inputformat=\"xml\""
238 " outputformat=\"marc\""
242 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
243 yaz_record_conv_destroy(p);
245 YAZ_CHECK(conv_configure_test("<backend>"
247 " outputcharset=\"utf-8\""
248 " inputcharset=\"marc-8\""
249 " outputformat=\"marcxml\""
250 " inputformat=\"marc\""
254 YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
255 yaz_record_conv_destroy(p);
258 YAZ_CHECK(conv_configure_test("<backend>"
259 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
260 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
262 " inputcharset=\"utf-8\""
263 " outputcharset=\"marc-8\""
264 " inputformat=\"xml\""
265 " outputformat=\"marc\""
268 " outputcharset=\"utf-8\""
269 " inputcharset=\"marc-8\""
270 " outputformat=\"marcxml\""
271 " inputformat=\"marc\""
275 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
276 yaz_record_conv_destroy(p);
279 YAZ_CHECK(conv_configure_test("<backend>"
280 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
281 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
283 " outputcharset=\"marc-8\""
284 " inputformat=\"xml\""
285 " outputformat=\"marc\""
288 " inputcharset=\"marc-8\""
289 " outputformat=\"marcxml\""
290 " inputformat=\"marc\""
294 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
295 yaz_record_conv_destroy(p);
298 static void tst_convert2(void)
300 yaz_record_conv_t p = 0;
301 const char *marcxml_rec =
302 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
303 " <leader>00080nam a22000498a 4500</leader>\n"
304 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
305 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
306 " <subfield code=\"a\">københavn</subfield>\n"
309 const char *iso2709_rec =
310 "\x30\x30\x30\x37\x37\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
311 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
312 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x34\x30\x30\x30\x31\x33"
313 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
314 "\x1F\x61\x6b\xb2\x62\x65\x6e\x68\x61\x76\x6e\x1E\x1D";
316 YAZ_CHECK(conv_configure_test("<backend>"
318 " inputcharset=\"utf-8\""
319 " outputcharset=\"marc-8\""
320 " inputformat=\"xml\""
321 " outputformat=\"marc\""
325 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
326 yaz_record_conv_destroy(p);
331 int main(int argc, char **argv)
333 YAZ_CHECK_INIT(argc, argv);
334 libxml2_error_to_yazlog(0 /* disable log */, 0);
348 * indent-tabs-mode: nil
350 * vim: shiftwidth=4 tabstop=8 expandtab