#! /usr/bin/perl -w
-# $Id: ezeerex2pqfproperties.pl,v 1.4 2006-06-19 16:41:03 mike Exp $
+# $Id: ezeerex2pqfproperties.pl,v 1.7 2006-06-20 11:24:22 mike Exp $
#
# Run like this:
# ./ezeerex2pqfproperties.pl zeerex.xml
my $xc = XML::LibXML::XPathContext->new($root);
$xc->registerNs(z => 'http://explain.z3950.org/dtd/2.0/');
-print_sets($xc);
-print_default_set($xc);
+my %setmap = print_sets($xc);
+print_default_set($xc, \%setmap);
print_indexes($xc);
print_relations($xc);
print_relation_modifiers($xc);
# SRU index: that way we could avoid defining
# set.bib1 = 1.2.840.10003.3.1
# which is a Z39.50 attribute set that we don't need for CQL. But
-# doing that would be a marginal gain.
+# doing that would be a lot of work for marginal gain.
#
sub print_sets {
my($xc) = @_;
+ my %setmap;
my(@nodes) = $xc->findnodes('z:indexInfo/z:set');
foreach my $node (@nodes) {
my $name = $node->findvalue('@name');
my $identifier = $node->findvalue('@identifier');
print "set.$name = $identifier\n";
+ $setmap{$name} = $identifier;
}
+
+ return %setmap;
}
sub print_default_set {
- my($xc) = @_;
+ my($xc, $setmap) = @_;
my (@nodes) = $xc->findnodes('z:configInfo/' .
'z:default[@type="contextSet"]');
foreach my $node (@nodes) {
- ### Look this up and render as a URI
- print "set = ", $node->findvalue('.'), "\n";
+ my $name = $node->findvalue('.');
+ my $identifier = $setmap->{$name}
+ or die "no identifier for default context-set name '$name'";
+
+ print "# default context-set name '$name'\n";
+ print "set = $identifier\n";
}
}
foreach my $node ($xc->findnodes('z:indexInfo/' .
'z:index[@search="true"]')) {
- my @pqf = $xc->findnodes("z:map/z:attr", $node);
+ my @pqf = $xc->findnodes("z:map[z:attr]", $node);
die("no PQF mapping for index '" .
$xc->findvalue("z:title", $node) . "'")
if @pqf == 0;
- my $ptype = $xc->findvalue('@type', $pqf[0]);
- my $pval = $xc->findvalue(".", $pqf[0]);
+ # Just pick one if there's more than one: they all work
+
+ my $attrstr = "";
+ foreach my $attr ($xc->findnodes("z:attr", $pqf[0])) {
+ my $ptype = $xc->findvalue('@type', $attr);
+ my $pval = $xc->findvalue(".", $attr);
+ $attrstr .= " $ptype=$pval";
+ }
foreach my $map ($xc->findnodes("z:map", $node)) {
my $setname = $xc->findvalue('z:name/@set', $map);
my $indexname = $xc->findvalue('z:name', $map);
- print "index.$setname.$indexname = $ptype=$pval\n"
+ print "index.$setname.$indexname =$attrstr\n"
if $indexname ne "";
}
}