This is based on a patch by Sven Porst and the functionality
of the YAZ Generic Frontend Server.
for more information.
</para>
<para>
for more information.
</para>
<para>
+ Optionally the default stylesheet may be specified. If the client
+ do not specify a stylesheet, the CDATA of element
+ <literal>stylesheet</literal> is used.
+ </para>
+ <para>
All Z39.50 packages and all HTTP packages that do not resolve to
one configured database name are passed unaltered to the next
filters on the route.
All Z39.50 packages and all HTTP packages that do not resolve to
one configured database name are passed unaltered to the next
filters on the route.
A typical configuration looks like this:
<screen><![CDATA[
<filter type="sru_z3950">
A typical configuration looks like this:
<screen><![CDATA[
<filter type="sru_z3950">
+ <stylesheet>/my.xsl</stylesheet>
<database name="Default">
<explain xmlns="http://explain.z3950.org/dtd/2.0/">
...
<database name="Default">
<explain xmlns="http://explain.z3950.org/dtd/2.0/">
...
<port>@:9000</port>
</filter>
<filter id="sru" type="sru_z3950">
<port>@:9000</port>
</filter>
<filter id="sru" type="sru_z3950">
+ <stylesheet>/my.xsl</stylesheet>
<database name="Default">
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
href="../etc/explain.xml"/>
<database name="Default">
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
href="../etc/explain.xml"/>
FrontendPtr get_frontend(mp::Package &package);
void release_frontend(mp::Package &package);
std::map<std::string, const xmlNode *> m_database_explain;
FrontendPtr get_frontend(mp::Package &package);
void release_frontend(mp::Package &package);
std::map<std::string, const xmlNode *> m_database_explain;
+ std::string default_stylesheet;
typedef std::map<std::string, int> ActiveUrlMap;
typedef std::map<std::string, int> ActiveUrlMap;
if (dbnode->type != XML_ELEMENT_NODE)
continue;
if (dbnode->type != XML_ELEMENT_NODE)
continue;
- std::string database;
- mp::xml::check_element_mp(dbnode, "database");
-
- for (struct _xmlAttr *attr = dbnode->properties;
- attr; attr = attr->next)
+ if (!strcmp((const char *) dbnode->name, "database"))
- mp::xml::check_attribute(attr, "", "name");
- database = mp::xml::get_text(attr);
-
- const xmlNode *explainnode;
- for (explainnode = dbnode->children;
- explainnode; explainnode = explainnode->next)
+ for (struct _xmlAttr *attr = dbnode->properties;
+ attr; attr = attr->next)
- if (explainnode->type != XML_ELEMENT_NODE)
- continue;
- if (explainnode)
- break;
+ mp::xml::check_attribute(attr, "", "name");
+ database = mp::xml::get_text(attr);
+
+ const xmlNode *explainnode;
+ for (explainnode = dbnode->children;
+ explainnode; explainnode = explainnode->next)
+ {
+ if (explainnode->type == XML_ELEMENT_NODE)
+ {
+ m_database_explain.insert(
+ std::make_pair(database, explainnode));
+ break;
+ }
+ }
- // assigning explain node to database name - no check yet
- m_database_explain.insert(std::make_pair(database, explainnode));
+ }
+ else if (!strcmp((const char *) dbnode->name, "stylesheet"))
+ {
+ default_stylesheet = mp::xml::get_text(dbnode);
+ }
+ else
+ {
+ throw mp::filter::FilterException
+ ("Bad element "
+ + std::string((const char *) dbnode->name)
+ + " in sru_z3950"
+ );
// decode SRU request
Z_SOAP *soap = 0;
char *charset = 0;
// decode SRU request
Z_SOAP *soap = 0;
char *charset = 0;
+ const char *stylesheet = 0;
// filter acts as sink for non-valid SRU requests
if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
sru_pdu_res, &soap,
// filter acts as sink for non-valid SRU requests
if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
sru_pdu_res, &soap,
if (sru_pdu_req->which == Z_SRW_explain_request)
{
Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
if (sru_pdu_req->which == Z_SRW_explain_request)
{
Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
+ stylesheet = er_req->stylesheet;
+
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode, er_req);
}
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode, er_req);
}
&& sru_pdu_req->u.request)
{ // searchRetrieve
Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
&& sru_pdu_req->u.request)
{ // searchRetrieve
Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
+ stylesheet = sr_req->stylesheet;
sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_searchRetrieve_response,
sru_pdu_req->srw_version);
sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_searchRetrieve_response,
sru_pdu_req->srw_version);
{
sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_scan_response,
sru_pdu_req->srw_version);
{
sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_scan_response,
sru_pdu_req->srw_version);
+ stylesheet = sru_pdu_req->u.scan_request->stylesheet;
// we do not do scan at the moment, therefore issuing a diagnostic
yaz_add_srw_diagnostic(odr_en,
// we do not do scan at the moment, therefore issuing a diagnostic
yaz_add_srw_diagnostic(odr_en,
odr_strdup(odr_en, wrbuf_cstr(w));
}
}
odr_strdup(odr_en, wrbuf_cstr(w));
}
}
+ if (!stylesheet && default_stylesheet.length())
+ stylesheet = default_stylesheet.c_str();
// build and send SRU response
mp_util::build_sru_response(package, odr_en, soap,
// build and send SRU response
mp_util::build_sru_response(package, odr_en, soap,
char *stylesheet = 0;
if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
sru_pdu_res, &soap,
char *stylesheet = 0;
if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
sru_pdu_res, &soap,
{
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode);
{
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode);
mp::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
Z_SOAP **soap,
mp::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
Z_SOAP **soap,
- char *charset,
- char *stylesheet)
{
Z_GDU *zgdu_req = package.request().get();
Z_SRW_PDU *sru_pdu_req = 0;
{
Z_GDU *zgdu_req = package.request().get();
Z_SRW_PDU *sru_pdu_req = 0;
metaproxy_1::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
Z_SOAP **soap,
metaproxy_1::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
Z_SOAP **soap,
- char *charset,
- char *stylesheet);
bool check_sru_query_exists(metaproxy_1::Package &package,
metaproxy_1::odr &odr_en,
bool check_sru_query_exists(metaproxy_1::Package &package,
metaproxy_1::odr &odr_en,
attribute type { "sru_z3950" },
attribute id { xsd:NCName }?,
attribute name { xsd:NCName }?,
attribute type { "sru_z3950" },
attribute id { xsd:NCName }?,
attribute name { xsd:NCName }?,
+ element mp:stylesheet { xsd:string }?,
element mp:database {
attribute name { xsd:NCName },
any
element mp:database {
attribute name { xsd:NCName },
any