facturized DOM XML indexing code out into function
authorMarc Cromme <marc@indexdata.dk>
Tue, 13 Feb 2007 11:37:02 +0000 (11:37 +0000)
committerMarc Cromme <marc@indexdata.dk>
Tue, 13 Feb 2007 11:37:02 +0000 (11:37 +0000)
static void extract_doc_alvis(struct filter_info *tinfo,
                              struct recExtractCtrl *recctr,
                              xmlDocPtr doc)
This is the function to be re-written using both PI and <z:index> instructions,
and also fixing the bug of index type 'p' and '0' chop-over of merged content.

index/mod_dom.c
test/xslt/dom-config-col.xml
test/xslt/dom-index.xsl

index 7335ca4..26ae1a7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mod_dom.c,v 1.3 2007-02-12 13:24:31 marc Exp $
+/* $Id: mod_dom.c,v 1.4 2007-02-13 11:37:02 marc Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -847,14 +847,44 @@ static void index_record(struct filter_info *tinfo,struct recExtractCtrl *ctrl,
          yaz_log(YLOG_WARN, "dom filter: unknown record type '%s'", 
                  type_str);
 }
-    
-static int extract_doc(struct filter_info *tinfo, struct filter_input *input,
-                       struct recExtractCtrl *p, xmlDocPtr doc)
+
+
+static void extract_doc_alvis(struct filter_info *tinfo, 
+                              struct recExtractCtrl *recctr, 
+                              xmlDocPtr doc)
 {
-    RecWord recWord;
-    const char *params[10];
+    if (doc){
+        RecWord recWord;
+        xmlChar *buf_out;
+        int len_out;
+        xmlNodePtr root_ptr;
+
+        (*recctr->init)(recctr, &recWord);
+        
+       if (recctr->flagShowRecords){
+            xmlDocDumpMemory(doc, &buf_out, &len_out);
+           fwrite(buf_out, len_out, 1, stdout);
+           xmlFree(buf_out);
+       }
+       root_ptr = xmlDocGetRootElement(doc);
+       if (root_ptr)
+           index_record(tinfo, recctr, root_ptr, &recWord);
+        else
+                yaz_log(YLOG_WARN, "No root for index XML record");
+    }
+}
+
+
+static int convert_extract_doc(struct filter_info *tinfo, 
+                               struct filter_input *input,
+                               struct recExtractCtrl *p, 
+                               xmlDocPtr doc)
+
+{
+    /* RecWord recWord; */
     xmlChar *buf_out;
     int len_out;
+    const char *params[10];
     xsltStylesheetPtr last_xsp = 0;
     xmlDocPtr store_doc = 0;
 
@@ -864,7 +894,7 @@ static int extract_doc(struct filter_info *tinfo, struct filter_input *input,
     /* input conversion */
     perform_convert(tinfo, input->convert, params, &doc, 0);
 
-    (*p->init)(p, &recWord);
+    /* (*p->init)(p, &recWord); */
 
     if (tinfo->store)
     {
@@ -889,8 +919,13 @@ static int extract_doc(struct filter_info *tinfo, struct filter_input *input,
 
     /* extract conversion */
     perform_convert(tinfo, tinfo->extract->convert, params, &doc, 0);
+
     if (doc)
     {
+
+        extract_doc_alvis(tinfo, p, doc);
+        
+        /*
         xmlNodePtr root_ptr;
        if (p->flagShowRecords)
        {
@@ -905,8 +940,11 @@ static int extract_doc(struct filter_info *tinfo, struct filter_input *input,
         {
            yaz_log(YLOG_WARN, "No root for index XML record");
         }
+        */
+
        xmlFreeDoc(doc);
-    }    
+    }
+
     return RECCTRL_EXTRACT_OK;
 }
 
@@ -946,7 +984,7 @@ static int extract_xml_split(struct filter_info *tinfo,
                 
                 xmlDocSetRootElement(doc, ptr2);
                 
-                return extract_doc(tinfo, input, p, doc);
+                return convert_extract_doc(tinfo, input, p, doc);
             }
             else
             {
@@ -976,7 +1014,7 @@ static int extract_xml_full(struct filter_info *tinfo,
         {
             return RECCTRL_EXTRACT_ERROR_GENERIC;
         }
-        return extract_doc(tinfo, input, p, doc);
+        return convert_extract_doc(tinfo, input, p, doc);
     }
     else
         return RECCTRL_EXTRACT_EOF;
@@ -1030,7 +1068,7 @@ static int extract_iso2709(struct filter_info *tinfo,
         yaz_marc_write_xml(input->u.marc.handle, &root_ptr, 0, 0, 0);
         rdoc = xmlNewDoc((const xmlChar*) "1.0");
         xmlDocSetRootElement(rdoc, root_ptr);
-        return extract_doc(tinfo, input, p, rdoc);        
+        return convert_extract_doc(tinfo, input, p, rdoc);        
     }
     return RECCTRL_EXTRACT_OK;
 }
index 923ca8a..39e7f0c 100644 (file)
@@ -1,6 +1,7 @@
 <dom>
-  <!-- $Id: dom-config-col.xml,v 1.1 2007-02-07 12:08:54 adam Exp $ -->
+  <!-- $Id: dom-config-col.xml,v 1.2 2007-02-13 11:37:03 marc Exp $ -->
   <extract name="index">
+      <!-- <xslt stylesheet="dom-index.xsl"/> -->
       <xslt stylesheet="index.xsl"/>
   </extract>
   <retrieve name="F">
index b372b81..82c7102 100644 (file)
@@ -2,12 +2,17 @@
   xmlns:m="http://www.loc.gov/MARC21/slim"
   exclude-result-prefixes="m"
   version="1.0">
-  <!-- $Id: dom-index.xsl,v 1.1 2007-02-12 14:00:20 marc Exp $ -->
+  <!-- $Id: dom-index.xsl,v 1.2 2007-02-13 11:37:03 marc Exp $ -->
   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
   
 
   <xsl:template match="text()"/>
 
+  <!--
+  <xsl:template match="processing-instruction()">
+    <xsl:copy-of select="."/>
+  </xsl:template>
+  -->
 
   <xsl:template match="/m:record">
     <xsl:processing-instruction name="zebra-2.0">
@@ -37,6 +42,8 @@
     <title>
         <xsl:value-of select="."/>
     </title>
+    <!-- comment -->
+    <?zebra-2.0 xyz?>
   </xsl:template>
 
 </xsl:stylesheet>