The record_conv reads the XSL file in two steps.. Reads XSL as XML
Document.. Then passes that to XSL at each invocation to ensure the
record_conv is multi-threaded. This patch ensures that XML document
is copied before passed to XSL (instead of after). This makes at
least one XSL transform behave differently (and correct).
wrbuf_printf(p->wr_error, " with path '%s'", p->path);
return -1;
}
wrbuf_printf(p->wr_error, " with path '%s'", p->path);
return -1;
}
- xsp = xsltParseStylesheetDoc(xsp_doc);
+ /* need to copy this before passing it to the processor. It will
+ be encapsulated in the xsp and destroyed by xsltFreeStylesheet */
+ xsp = xsltParseStylesheetDoc(xmlCopyDoc(xsp_doc, 1));
if (!xsp)
{
wrbuf_printf(p->wr_error, "Element: <xslt stylesheet=\"%s\"/>:"
if (!xsp)
{
wrbuf_printf(p->wr_error, "Element: <xslt stylesheet=\"%s\"/>:"
"EXSLT not supported"
#endif
")");
"EXSLT not supported"
#endif
")");
return -1;
}
else
{
struct yaz_record_conv_rule *r =
add_rule(p, YAZ_RECORD_CONV_RULE_XSLT);
return -1;
}
else
{
struct yaz_record_conv_rule *r =
add_rule(p, YAZ_RECORD_CONV_RULE_XSLT);
- r->u.xslt.xsp_doc = xmlCopyDoc(xsp_doc, 1);
- xsltFreeStylesheet(xsp); /* will free xsp_doc */
+ r->u.xslt.xsp_doc = xsp_doc;
+ xsltFreeStylesheet(xsp);