so one can have a setup like
<metadata>
<metadata name="language" brief="yes" merge="unique" termlist="yes"/>
<metadata name="id" brief="yes"/>
<metadata name="lccn" merge="unique"/>
</metadata>
The underlying desire is to be able to include the complete metadata setup with XInclude.
This requires us to have a single container with all elements.
This patch adjust the metadata element counting and evaluation to interpret both metadata tags on their own and containers with metadata tags in them.
Attributes of a metadata container tag are ignored.
+
+static void service_add_metadata(xmlNode *n, int *num_metadata, int *num_sortkeys)
+{
+ (*num_metadata)++;
+
+ xmlChar *sortkey = xmlGetProp(n, (xmlChar *) "sortkey");
+ if (sortkey && strcmp((const char *) sortkey, "no"))
+ (*num_sortkeys)++;
+ xmlFree(sortkey);
+}
+
+
static struct conf_service *service_create_static(struct conf_server *server,
xmlNode *node,
const char *service_id)
static struct conf_service *service_create_static(struct conf_server *server,
xmlNode *node,
const char *service_id)
if (n->type == XML_ELEMENT_NODE && !strcmp((const char *)
n->name, "metadata"))
{
if (n->type == XML_ELEMENT_NODE && !strcmp((const char *)
n->name, "metadata"))
{
- xmlChar *sortkey = xmlGetProp(n, (xmlChar *) "sortkey");
- num_metadata++;
- if (sortkey && strcmp((const char *) sortkey, "no"))
- num_sortkeys++;
- xmlFree(sortkey);
+ if (n->children) // This is a <metadata> container, look at its contents.
+ {
+ xmlNode *m;
+ for (m = n->children; m; m = m->next)
+ {
+ if (m->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) m->name, "metadata"))
+ service_add_metadata(m, &num_metadata, &num_sortkeys);
+ }
+ }
+ else // This is a metadata-element proper, count it right away.
+ service_add_metadata(n, &num_metadata, &num_sortkeys);
}
service = service_init(server, num_metadata, num_sortkeys, service_id);
}
service = service_init(server, num_metadata, num_sortkeys, service_id);
}
else if (!strcmp((const char *) n->name, (const char *) "metadata"))
{
}
else if (!strcmp((const char *) n->name, (const char *) "metadata"))
{
- if (parse_metadata(service, n, &md_node, &sk_node))
- return 0;
+ if (n->children) // This is a <metadata> container, look at its content.
+ {
+ xmlNode *m;
+ for (m = n->children; m; m = m->next)
+ if ((!strcmp((const char *) m->name, (const char *) "metadata")))
+ if (parse_metadata(service, m, &md_node, &sk_node))
+ return 0;
+ }
+ else // This is a metadata-element proper, count it right away.
+ if (parse_metadata(service, n, &md_node, &sk_node))
+ return 0;
}
else if (!strcmp((const char *) n->name, (const char *) "xslt"))
{
}
else if (!strcmp((const char *) n->name, (const char *) "xslt"))
{
if (!strcmp(rank_length, "linear"))
service->rank_length = 2;
else if (!strcmp(rank_length, "log"))
if (!strcmp(rank_length, "linear"))
service->rank_length = 2;
else if (!strcmp(rank_length, "log"))
- service->rank_length = 1;
+ service->rank_length = 1;
else if (!strcmp(rank_length, "none"))
service->rank_length = 0;
else
else if (!strcmp(rank_length, "none"))
service->rank_length = 0;
else