Stylesheet support.
[yaz-moved-to-github.git] / src / srw.c
index e3f4d72..cf22d06 100644 (file)
--- a/src/srw.c
+++ b/src/srw.c
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 2002-2003, Index Data.
+ * Copyright (c) 2002-2004, Index Data.
  * See the file LICENSE for details.
  *
- * $Id: srw.c,v 1.12 2004-01-05 14:05:56 adam Exp $
+ * $Id: srw.c,v 1.15 2004-01-07 20:36:44 adam Exp $
  */
 
 #include <yaz/srw.h>
@@ -113,12 +113,14 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o,
     if (!match_element(ptr, elem))
         return 0;
     ptr = ptr->children;
+    while (ptr && ptr->type != XML_TEXT_NODE && ptr->type != XML_COMMENT_NODE)
+       ptr = ptr->next;
     if (!ptr)
         return 0;
     buf = xmlBufferCreate();
-
+    
     xmlNodeDump(buf, ptr->doc, ptr, 0, 0);
-
+    
     *val = odr_malloc(o, buf->use+1);
     memcpy (*val, buf->content, buf->use);
     (*val)[buf->use] = '\0';
@@ -130,7 +132,6 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o,
 
     return 1;
 }
-
                      
 static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val)
 {
@@ -182,9 +183,9 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec,
                ;
            else if (match_xsd_string(ptr, "recordPacking", o, &spack))
            {
-               if (pack && !strcmp(spack, "xml"))
+               if (spack && !strcmp(spack, "xml"))
                    pack = Z_SRW_recordPacking_XML;
-               if (pack && !strcmp(spack, "string"))
+               if (spack && !strcmp(spack, "string"))
                    pack = Z_SRW_recordPacking_string;
            }
            else if (match_xsd_integer(ptr, "recordPosition", o, 
@@ -243,11 +244,14 @@ static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs,
         if (!*num)
             return 1;
         *recs = odr_malloc(o, *num * sizeof(**recs));
-        for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
+        for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
         {
             if (ptr->type == XML_ELEMENT_NODE &&
                 !strcmp(ptr->name, "record"))
+           {
                yaz_srw_record(o, ptr, (*recs)+i, client_data, ns);
+               i++;
+           }
         }
     }
     else if (o->direction == ODR_ENCODE)
@@ -524,11 +528,15 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
             req = (*p)->u.explain_request = odr_malloc(o, sizeof(*req));
            req->recordPacking = 0;
            req->database = 0;
+           req->stylesheet = 0;
            for (; ptr; ptr = ptr->next)
            {
                if (match_xsd_string(ptr, "database", o,
                                     &req->database))
                     ;
+               else if (match_xsd_string(ptr, "stylesheet", o,
+                                         &req->stylesheet))
+                   ;
                else if (match_xsd_string(ptr, "recordPacking", o,
                                     &req->recordPacking))
                    ;
@@ -705,11 +713,14 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
         }
         else if ((*p)->which == Z_SRW_explain_request)
         {
+            Z_SRW_explainRequest *req = (*p)->u.explain_request;
             xmlNodePtr ptr = xmlNewChild(pptr, 0, "explainRequest", 0);
            ns_srw = xmlNewNs(ptr, ns, "zs");
            xmlSetNs(ptr, ns_srw);
 
            add_xsd_string(ptr, "version", (*p)->srw_version);
+            add_xsd_string(ptr, "recordPacking", req->recordPacking);
+            add_xsd_string(ptr, "stylesheet", req->stylesheet);
         }
         else if ((*p)->which == Z_SRW_explain_response)
         {