1) no <input> element at all
2) empty <input> element
3) <input> element starting with an <xslt> instruction (that is, <xmlreader> and/or <marc> not mandatory any more.
Needed to make new define DOM_INPUT_DOM besides DOM_INPUT_MARC and DOM_INPUT_XMLREADER
Still missing detection of <xmlreader> or <marc> after all <xslt> nodes.
And more important: when finding errors here, it's kind of lam just to emit an warning, one should stop processing!
-/* $Id: mod_dom.c,v 1.30 2007-03-07 14:18:35 marc Exp $
+/* $Id: mod_dom.c,v 1.31 2007-03-08 17:19:12 marc Exp $
Copyright (C) 1995-2007
Index Data ApS
Copyright (C) 1995-2007
Index Data ApS
struct filter_retrieve *next;
};
struct filter_retrieve *next;
};
#define DOM_INPUT_XMLREADER 1
#define DOM_INPUT_MARC 2
struct filter_input {
#define DOM_INPUT_XMLREADER 1
#define DOM_INPUT_MARC 2
struct filter_input {
int type;
union {
struct {
int type;
union {
struct {
- const char *input_charset;
- yaz_marc_t handle;
- yaz_iconv_t iconv;
- } marc;
struct {
xmlTextReaderPtr reader;
int split_level;
} xmlreader;
struct {
xmlTextReaderPtr reader;
int split_level;
} xmlreader;
+ struct {
+ const char *input_charset;
+ yaz_marc_t handle;
+ yaz_iconv_t iconv;
+ } marc;
} u;
struct filter_input *next;
};
} u;
struct filter_input *next;
};
+ case DOM_INPUT_DOM:
+ break;
case DOM_INPUT_XMLREADER:
if (i_ptr->u.xmlreader.reader)
xmlFreeTextReader(i_ptr->u.xmlreader.reader);
case DOM_INPUT_XMLREADER:
if (i_ptr->u.xmlreader.reader)
xmlFreeTextReader(i_ptr->u.xmlreader.reader);
parse_convert(tinfo, ptr, &p->convert);
break;
}
parse_convert(tinfo, ptr, &p->convert);
break;
}
+ else if (!XML_STRCMP(ptr->name, "xslt")){
+ struct filter_input *p
+ = new_input(tinfo, DOM_INPUT_DOM);
+ parse_convert(tinfo, ptr, &p->convert);
+ break;
+ }
else
{
dom_log(YLOG_WARN, tinfo, ptr,
else
{
dom_log(YLOG_WARN, tinfo, ptr,
- "bad element <%s>, expected <marc>|<xmlreader>",
+ "bad element <%s>, expected <marc>|<xmlreader>|<xslt>",
ptr->name);
return ZEBRA_FAIL;
}
ptr->name);
return ZEBRA_FAIL;
}
+
+ /* adding an empty DOM dummy type if no <input> list has been defined */
+ if (! tinfo->input_list){
+ struct filter_input *p
+ = new_input(tinfo, DOM_INPUT_DOM);
+ }
+
xmlChar *buf_out = 0;
int len_out = 0;
xmlDocDumpMemory(doc, &buf_out, &len_out);
xmlChar *buf_out = 0;
int len_out = 0;
xmlDocDumpMemory(doc, &buf_out, &len_out);
- yaz_log(YLOG_LOG, "%s: XMLREADER depth: %i\n%.*s",
+ yaz_log(YLOG_LOG, "%s: XMLREADER level: %i\n%.*s",
tinfo->fname ? tinfo->fname : "(none)",
depth, len_out, buf_out);
xmlFree(buf_out);
tinfo->fname ? tinfo->fname : "(none)",
depth, len_out, buf_out);
xmlFree(buf_out);
struct filter_info *tinfo = clientData;
struct filter_input *input = tinfo->input_list;
struct filter_info *tinfo = clientData;
struct filter_input *input = tinfo->input_list;
- if (!input)
- return RECCTRL_EXTRACT_ERROR_GENERIC;
+ if (!input)
+ return RECCTRL_EXTRACT_ERROR_GENERIC;
+
odr_reset(tinfo->odr_record);
switch(input->type)
{
odr_reset(tinfo->odr_record);
switch(input->type)
{
+ case DOM_INPUT_DOM:
+ return extract_xml_full(tinfo, input, p);
+ break;
case DOM_INPUT_XMLREADER:
if (input->u.xmlreader.split_level == 0)
return extract_xml_full(tinfo, input, p);
case DOM_INPUT_XMLREADER:
if (input->u.xmlreader.split_level == 0)
return extract_xml_full(tinfo, input, p);
- <!-- $Id: dom-config-one.xml,v 1.3 2007-03-08 11:24:50 marc Exp $ -->
+ <!-- $Id: dom-config-one.xml,v 1.4 2007-03-08 17:19:13 marc Exp $ -->
+
+ <!--
<input syntax="xml">
<xmlreader level="0"/>
<xslt stylesheet="id.xsl"/>
</input>
<input syntax="xml">
<xmlreader level="0"/>
<xslt stylesheet="id.xsl"/>
</input>
<extract name="index">
<xslt stylesheet="dom-index-element-chop.xsl"/>
<!-- <xslt stylesheet="dom-index-element.xsl"/> -->
<extract name="index">
<xslt stylesheet="dom-index-element-chop.xsl"/>
<!-- <xslt stylesheet="dom-index-element.xsl"/> -->
modulePath: ../../index/.libs
#recordType: dom.dom-config-skipped.xml
modulePath: ../../index/.libs
#recordType: dom.dom-config-skipped.xml
-recordType: dom.dom-config-col.xml
+#recordType: dom.dom-config-col.xml
+recordType: dom.dom-config-one.xml