- if (identifier_flag)
- {
- i += identifier_flag-1;
- for (j = 0; j<indicator_length; j++, i++)
- {
- switch(mt->xml)
- {
- case YAZ_MARC_ISO2709:
- wrbuf_putc(wr, buf[i]);
- break;
- case YAZ_MARC_LINE:
- wrbuf_putc(wr, buf[i]);
- break;
- case YAZ_MARC_SIMPLEXML:
- wrbuf_printf(wr, " Indicator%d=\"", j+1);
- marc_cdata(mt, buf+i, 1, wr);
- wrbuf_printf(wr, "\"");
- break;
- case YAZ_MARC_OAIMARC:
- wrbuf_printf(wr, " i%d=\"", j+1);
- marc_cdata(mt, buf+i, 1, wr);
- wrbuf_printf(wr, "\"");
- break;
- case YAZ_MARC_MARCXML:
- case YAZ_MARC_XCHANGE:
- wrbuf_printf(wr, " ind%d=\"", j+1);
- marc_cdata(mt, buf+i, 1, wr);
- wrbuf_printf(wr, "\"");
- }
+ if (!turbo) {
+ ptr_subfield = xmlNewTextChild(
+ ptr, ns_record,
+ BAD_CAST "subfield", BAD_CAST wrbuf_cstr(wr_cdata));
+ wrbuf_rewind(wr_cdata);
+ wrbuf_iconv_write(wr_cdata, mt->iconv_cd,s->code_data, using_code_len);
+ xmlNewProp(ptr_subfield, BAD_CAST "code",
+ BAD_CAST wrbuf_cstr(wr_cdata));
+ }
+ else { // Turbo format
+ wrbuf_rewind(subfield_name);
+ wrbuf_puts(subfield_name, "s");
+ // TODO Map special codes to something possible for XML ELEMENT names
+ if ((s->code_data[0] >= '0' && s->code_data[0] <= '9') ||
+ (s->code_data[0] >= 'a' && s->code_data[0] <= 'z') ||
+ (s->code_data[0] >= 'A' && s->code_data[0] <= 'Z'))
+ {
+ wrbuf_iconv_write(subfield_name, mt->iconv_cd,s->code_data, using_code_len);
+ }
+ else {
+ char buffer[2*using_code_len + 1];
+ int index;
+ for (index = 0; index < using_code_len; index++) {
+ sprintf(buffer + 2*index, "%02X", (unsigned char) s->code_data[index] & 0xFF);
+ };
+ buffer[2*(index+1)] = 0;
+ wrbuf_puts(subfield_name, "-");
+ wrbuf_puts(subfield_name, buffer);
+ yaz_log(YLOG_WARN, "Using numeric value in element name: %s", buffer);
+ }
+ ptr_subfield = xmlNewTextChild(ptr, ns_record,
+ BAD_CAST wrbuf_cstr(subfield_name),
+ BAD_CAST wrbuf_cstr(wr_cdata));
+ }
+ }
+ wrbuf_destroy(subfield_name);
+}
+
+int yaz_marc_write_turbo_xml(yaz_marc_t mt, xmlNode **root_ptr,
+ const char *ns,
+ const char *format,
+ const char *type)
+{
+ struct yaz_marc_node *n;
+ int identifier_length;
+ const char *leader = 0;
+ xmlNode *record_ptr;
+ xmlNsPtr ns_record;
+ WRBUF wr_cdata = 0;
+ int turbo = mt->turbo_format;
+ for (n = mt->nodes; n; n = n->next)
+ if (n->which == YAZ_MARC_LEADER)
+ {
+ leader = n->u.leader;
+ break;
+ }
+
+ if (!leader)
+ return -1;
+ if (!atoi_n_check(leader+11, 1, &identifier_length))
+ return -1;
+
+ wr_cdata = wrbuf_alloc();
+
+ record_ptr = xmlNewNode(0, BAD_CAST "record");
+ *root_ptr = record_ptr;
+
+ ns_record = xmlNewNs(record_ptr, BAD_CAST ns, 0);
+ xmlSetNs(record_ptr, ns_record);
+
+ if (format)
+ xmlNewProp(record_ptr, BAD_CAST "format", BAD_CAST format);
+ if (type)
+ xmlNewProp(record_ptr, BAD_CAST "type", BAD_CAST type);
+ for (n = mt->nodes; n; n = n->next)
+ {
+ struct yaz_marc_subfield *s;
+ xmlNode *ptr;
+
+ switch(n->which)
+ {
+ case YAZ_MARC_DATAFIELD:
+ add_marc_datafield_turbo_xml(mt, n, record_ptr, ns_record, wr_cdata, identifier_length);
+ break;
+ case YAZ_MARC_CONTROLFIELD:
+ wrbuf_rewind(wr_cdata);
+ wrbuf_iconv_puts(wr_cdata, mt->iconv_cd, n->u.controlfield.data);
+ marc_iconv_reset(mt, wr_cdata);
+
+ if (!turbo) {
+ ptr = xmlNewTextChild(record_ptr, ns_record,
+ BAD_CAST "controlfield",
+ BAD_CAST wrbuf_cstr(wr_cdata));
+ xmlNewProp(ptr, BAD_CAST "tag", BAD_CAST n->u.controlfield.tag);