+ yaz_srw_record(o, rptr, (*recs)+i, (*extra ? *extra + i : 0),
+ client_data, ns);
+ }
+ }
+ return 0;
+}
+
+static int yaz_srw_version(ODR o, xmlNodePtr pptr, Z_SRW_recordVersion *rec,
+ void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ xmlNodePtr ptr;
+ rec->versionType = 0;
+ rec->versionValue = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+
+ if (match_xsd_string(ptr, "versionType", o,
+ &rec->versionType))
+ ;
+ else if (match_xsd_string(ptr, "versionValue", o,
+ &rec->versionValue))
+ ;
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ xmlNodePtr ptr = pptr;
+ add_xsd_string(ptr, "versionType", rec->versionType);
+ add_xsd_string(ptr, "versionValue", rec->versionValue);
+ }
+ return 0;
+}
+
+static int yaz_srw_versions(ODR o, xmlNodePtr pptr,
+ Z_SRW_recordVersion **vers,
+ int *num, void *client_data, const char *ns)
+{
+ if (o->direction == ODR_DECODE)
+ {
+ int i;
+ xmlNodePtr ptr;
+ *num = 0;
+ for (ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !xmlStrcmp(ptr->name, BAD_CAST "recordVersion"))
+ (*num)++;
+ }
+ if (!*num)
+ return 1;
+ *vers = (Z_SRW_recordVersion *) odr_malloc(o, *num * sizeof(**vers));
+ for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !xmlStrcmp(ptr->name, BAD_CAST "recordVersion"))
+ {
+ yaz_srw_version(o, ptr, *vers + i, client_data, ns);
+ i++;
+ }
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ int i;
+ for (i = 0; i < *num; i++)
+ {
+ xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST "version",
+ 0);
+ yaz_srw_version(o, rptr, (*vers)+i, client_data, ns);