<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.code4lib.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct</id>
		<title>Code4Lib - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.code4lib.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct"/>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/Special:Contributions/Newacct"/>
		<updated>2026-06-01T13:40:24Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=JQuery_HTML_Updater&amp;diff=6122</id>
		<title>JQuery HTML Updater</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=JQuery_HTML_Updater&amp;diff=6122"/>
				<updated>2010-09-10T06:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Umlaut]]&lt;br /&gt;
&lt;br /&gt;
If you want to include [[Umlaut]]-generated HTML directly on a third party page via javascript, there is a Javascript helper object to make that very easy. This helper uses the [[Umlaut partial html API]], but does everything for you.  The helper will update your page at DOM locations you specify, and keep polling Umlaut for new results, continuing to re-update your page until Umlaut is finished.   &lt;br /&gt;
&lt;br /&gt;
The Javascript helper object relies on JQuery.&lt;br /&gt;
&lt;br /&gt;
This Javascript helper is actually also used internally by Umlaut to load background results as they come in, on the Umlaut resolver menu page. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NOTE&amp;lt;/b&amp;gt;: The intended use case at the moment is a &amp;quot;single item&amp;quot; or &amp;quot;item detail&amp;quot; page. You may think &amp;quot;Gee, I want to embed umlaut content for every item on a 10-item results page!&amp;quot;   Handling this case isn't fully fleshed out yet, in part becuase it might put unreasonable load on an Umlaut server. But I have it in mind, and we may be able to get there, let jrochkind know if you demand it. &lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
You need to have the ability to add html &amp;lt;script&amp;gt; tags referencing external js files to the page you'd like to Embed Umlaut content in. You also need to be able to somehow make an OpenURL Context Object representing the thing you'd like to load Umlaut content for, and pass this to the Javascript.  If an OpenURL link is already on your HTML somewhere, Javascript can easily pull the 'context object' out of this (see example). &lt;br /&gt;
&lt;br /&gt;
You need to be willing to load the JQuery library on your page, although it can be loaded in &amp;quot;no conflict&amp;quot; mode if you also need Prototype or another JS library. jQuery 1.4 is highly recommended, although jQuery 1.3 will likely work too if you already depend on that in your application.&lt;br /&gt;
&lt;br /&gt;
== Step by Step ==&lt;br /&gt;
&lt;br /&gt;
In the following examples, $UMLAUT_BASE stands for the base URL you have installed Umlaut at, for instance http://findit.library.jhu.edu for JHU. &lt;br /&gt;
&lt;br /&gt;
=== Load JQuery ===&lt;br /&gt;
&lt;br /&gt;
You can load JQuery from your installed Umlaut if you want. It's probably best to load it in &amp;quot;no conflict&amp;quot; mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;$UMLAUT_BASE/javascripts/jquery/jquery-1.4.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
      jQuery.noConflict();&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load the Umlaut.HtmlUpdater object ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;$UMLAUT_BASEjavascripts/jquery/umlaut/update_html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optionally, load Umlaut Javascript UI Behaviors ===&lt;br /&gt;
&lt;br /&gt;
HTML loaded in by the HtmlUpdater may include javascript behaviors when displayed in Umlaut, such as expand/contract toggles.   You can choose to load JS files providing those behaviors into your local app. If you don't, certain links will degrade to linking out to Umlaut, but everything should still work fine. &lt;br /&gt;
&lt;br /&gt;
Currently, expand/contract toggles are actually the only js behavior supported on external pages; dialog boxes will necessarily degrade to links out to your Umlaut app. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://app01.mse.jhu.edu:3000/js_helper/loader&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    jQuery(function($) {&lt;br /&gt;
      var loader = new Umlaut.Loader();&lt;br /&gt;
      loader.load();&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instantiate an HtmlUpdater ===&lt;br /&gt;
&lt;br /&gt;
You need to instantiate an Umlaut.HtmlUpdater, and tell it your Umlaut base url, and a context object key-encoded-value query parameter string. If you already have an OpenURL link on the page, it may be convenient to pull the context object out of that, see [[#Complete Example|example]] below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  //inside a jQuery ready()&lt;br /&gt;
  var ctx = &amp;quot;sid=google&amp;amp;auinit=N&amp;amp;aulast=Chomsky&amp;amp;title=Aspects+of+the+Theory+of+Syntax&amp;amp;genre=book&amp;amp;isbn=0262530074&amp;amp;date=1965&amp;quot;&lt;br /&gt;
  var updater = new Umlaut.HtmlUpdater($UMLAUT_BASE,  ctx  );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure HtmlUpdater ===&lt;br /&gt;
&lt;br /&gt;
You use the add_section_target() method on your updater to tell it which blocks of Umlaut content you'd like to put where on your page. The argument to add_section_target() is a JS object containing options. &lt;br /&gt;
&lt;br /&gt;
In the simplest case, you can simply supply an umlaut section in the &amp;quot;umlaut_section_id&amp;quot; option, and the ID of a div you'd like to place the content in on your page in &amp;quot;selector&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
     umlaut_section_id: &amp;quot;fulltext&amp;quot;, &lt;br /&gt;
     selector:&amp;quot;#my_full_text_div&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The exact umlaut sections available may depend on your Umlaut configuration. To see the sections in a default Umlaut installation, see: AppConfig::Base.bg_update_map [http://umlaut.rubyforge.org/svn/trunk/config/initializers/umlaut/resolve_views.rb in resolve_views in svn]&lt;br /&gt;
&lt;br /&gt;
The selector argument can actually be any JQuery selector. By default, the first item on the page that matches this selector will have it's content entirely replaced by the specified umlaut section. However, you can also supply a &amp;quot;position&amp;quot; argument of &amp;quot;before&amp;quot;, &amp;quot;after&amp;quot;, &amp;quot;append&amp;quot;, or &amp;quot;prepend&amp;quot;, and the umlaut section will instead be inserted before or after the element matching your selector, or prepended or appended to the element's children. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;highlighted_links&amp;quot;, &lt;br /&gt;
    selector: &amp;quot;.sidebar&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Call the updater ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  //in a JQuery ready block&lt;br /&gt;
  updater.update();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The updater will now make a call to Umlaut, grab the content from Umlaut, and do what you've told it to do with it. Additionally, it will keep polling Umlaut until all content is available. How often it polls is configured by application config 'poll_wait_seconds', which defaults to 4 seconds. &lt;br /&gt;
&lt;br /&gt;
== Callbacks ==&lt;br /&gt;
&lt;br /&gt;
When configuring the HtmlUpdate object, there are several callbacks you can supply functions to, for your own code to be called. &lt;br /&gt;
&lt;br /&gt;
=== Section Target callbacks ===&lt;br /&gt;
&lt;br /&gt;
Callback functions provided with add_section_target can be useful for modifying the HTML returned by Umlaut before it's placed on your page, or modifying other parts of your page upon receiving content. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== before_update(html, count, target_obj) ====&lt;br /&gt;
&lt;br /&gt;
Called before the Umlaut html is actually on the page, you can use it to modify the HTML before it gets added to the page. &amp;quot;count&amp;quot; is a JS integer count of how many items are included in the section; sometimes you may wish to hide the whole section from the page if there are 0 items; returning &amp;quot;false&amp;quot; from before_update will cause the HtmlUpdater to *not* place the block on the page. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;target_obj&amp;quot; is an HtmlUpdate internal object that's probably not too useful unless you want to look at the source, but can be used for some complex things. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;highlighted_links&amp;quot;, &lt;br /&gt;
    selector: &amp;quot;.sidebar&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;, &lt;br /&gt;
    before_update: function(html, count) {&lt;br /&gt;
     $(html).find(&amp;quot;.section_heading h3&amp;quot;).hide();&lt;br /&gt;
&lt;br /&gt;
     return (count &amp;gt; 0);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== after_update(html, count, target_obj) ====&lt;br /&gt;
&lt;br /&gt;
Similar to before_update, but called after the html has been placed in the DOM on the page. In after_update (unlike before_update) you can call JQuery closest() on the html to look up in the DOM if you want. This could be used for instance to show a previously hidden parent element only if there are umlaut items available:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   updater.add_section_target({umlaut_section_id: &amp;quot;fulltext&amp;quot;, selector:&amp;quot;#my_fulltext&amp;quot;, &lt;br /&gt;
            after_update: function(html, count) {&lt;br /&gt;
               if (count !=0 ) {&lt;br /&gt;
                 $(html).closest(&amp;quot;div.something&amp;quot;).show();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== complete(target_obj) ====&lt;br /&gt;
&lt;br /&gt;
Complete on a given section is called after there are no more updates for that section. Currently, the HtmlUpdate isn't smart enough to know that until the entire Umlaut update is done however, so it'll be called at the same time as complete() on the updater as a whole. This may change in the future. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   updater.add_section_target({umlaut_section_id: &amp;quot;fulltext&amp;quot;, selector:&amp;quot;#my_fulltext&amp;quot;, &lt;br /&gt;
                               complete: function() { alert(&amp;quot;fulltext done!&amp;quot;) }});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HtmlUpdate callbacks ===&lt;br /&gt;
&lt;br /&gt;
Currently just one, for when the Umlaut update is complete (all content has been fetched). &lt;br /&gt;
&lt;br /&gt;
==== complete(updater_obj) ====&lt;br /&gt;
  updater.complete = function() {&lt;br /&gt;
    alert(&amp;quot;all content has been fetched!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Complete Example ==&lt;br /&gt;
For clarity, this example has some javascript source inline in a &amp;lt;script&amp;gt; tag, the code that specifies how content is to be loaded. That javascript code could of course instead be in an external js file referenced by a &amp;lt;script src=&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;$UMLAUT_BASE/javascripts/jquery/jquery-1.4.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     jQuery.noConflict();&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;$UMLAUT_BASE/javascripts/jquery/umlaut/update_html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;$UMLAUT_BASE/js_helper/loader&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
jQuery(function($) {&lt;br /&gt;
  var loader = new Umlaut.Loader();&lt;br /&gt;
  loader.load();&lt;br /&gt;
  &lt;br /&gt;
  /* pull openurl link out of the DOM, take umlaut base and context object&lt;br /&gt;
     out of it */ &lt;br /&gt;
  var openurl_link = $(&amp;quot;a.openurl_link&amp;quot;).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
  var ctx_object_kev = openurl_link.substring( openurl_link.indexOf(&amp;quot;?&amp;quot;) + 1);&lt;br /&gt;
  var umlaut_base = openurl_link.substring(0, openurl_link.indexOf(&amp;quot;/resolve&amp;quot;));&lt;br /&gt;
  var updater = new Umlaut.HtmlUpdater( umlaut_base  ,  ctx_object_kev );&lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;fulltext&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.my_full_text&amp;quot; ,&lt;br /&gt;
    // only show ourself if we have umlaut hits, false return from&lt;br /&gt;
    // before_update stops update.  &lt;br /&gt;
    before_update: function(html, count) { return (count != 0); }&lt;br /&gt;
  });   &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;search_inside&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.stuff&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;  &lt;br /&gt;
  });  &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;excerpts&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.stuff&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;&lt;br /&gt;
  });   &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;holding&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.stuff&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;,&lt;br /&gt;
    before_update: function(container_element) {&lt;br /&gt;
      //insert some content into the umlaut-delivered html&lt;br /&gt;
      //before it is placed on the page&lt;br /&gt;
      container_element.find(&amp;quot;h3&amp;quot;).after(&amp;quot;&amp;lt;h4&amp;gt;We love these holdings.&amp;lt;/h4&amp;gt;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });   &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({&lt;br /&gt;
      umlaut_section_id: &amp;quot;abstract&amp;quot;, &lt;br /&gt;
      selector:&amp;quot;.stuff&amp;quot;, &lt;br /&gt;
      position: &amp;quot;append&amp;quot;,  &lt;br /&gt;
      before_update: function(html, count) {&lt;br /&gt;
        //only show if there are hits&lt;br /&gt;
        return ( count != 0);&lt;br /&gt;
      }&lt;br /&gt;
   });     &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;related_items&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.stuff&amp;quot;, &lt;br /&gt;
    position: &amp;quot;append&amp;quot;&lt;br /&gt;
  });   &lt;br /&gt;
  &lt;br /&gt;
  updater.add_section_target({ &lt;br /&gt;
    umlaut_section_id: &amp;quot;highlighted_link&amp;quot;, &lt;br /&gt;
    selector:&amp;quot;.only_if_content&amp;quot;,&lt;br /&gt;
    after_update: function(updated_content, count) {&lt;br /&gt;
      //show the ancestor DOM element with certain class, only&lt;br /&gt;
      //if there are umlaut hits&lt;br /&gt;
      if ( count != 0 ) {&lt;br /&gt;
        updated_content.closest(&amp;quot;.only_if_content&amp;quot;).show();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    });   &lt;br /&gt;
  &lt;br /&gt;
    updater.add_section_target({&lt;br /&gt;
      umlaut_section_id: &amp;quot;export_citation&amp;quot;,&lt;br /&gt;
      selector:&amp;quot;.stuff&amp;quot;,&lt;br /&gt;
      position:&amp;quot;append&amp;quot;,&lt;br /&gt;
      before_update: function(content, count) {&lt;br /&gt;
        $(content).find(&amp;quot;.section_heading h3&amp;quot;).text(&amp;quot;My own crazy export options&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    updater.complete = function() { alert(&amp;quot;Umlaut fully loaded&amp;quot;) };&lt;br /&gt;
  &lt;br /&gt;
    updater.update();   &lt;br /&gt;
&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a class=&amp;quot;openurl_link&amp;quot; href=&amp;quot;http://$UMLAUT_BASE/resolve?sid=google&amp;amp;auinit=N&amp;amp;aulast=Chomsky&amp;amp;title=Aspects+of+the+Theory+of+Syntax&amp;amp;genre=book&amp;amp;isbn=0262530074&amp;amp;date=1965&amp;quot;&amp;gt;Find It @ JH&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Full Text&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;my_full_text&amp;quot;&amp;gt;&lt;br /&gt;
Replace me.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;More Stuff&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;stuff&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;only_if_content&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&lt;br /&gt;
This will be shown only if it actually contains content. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=Getting_Started_with_Zebra&amp;diff=4465</id>
		<title>Getting Started with Zebra</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=Getting_Started_with_Zebra&amp;diff=4465"/>
				<updated>2010-02-12T00:54:32Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I will try to outline here how to index (and search) [[MARC]] records using [[Zebra]], but tweaking the indexing process is a bit trickier than I know how to do.&lt;br /&gt;
&lt;br /&gt;
1. Install [[yaz]], zebra, and all of their friends. I have found that the &amp;quot;standard&amp;quot; make process works pretty well, but allow yaz and zebra to specify where it puts various configuration files. The extra specification is not worth the effort.&lt;br /&gt;
&lt;br /&gt;
2. Save your MARC records someplace on your file system. By &amp;quot;binary&amp;quot; MARC records, I suppose you mean &amp;quot;real&amp;quot; MARC records -- MARC records in communications format -- MARC records as the types of records fed to traditional integrated library systems. This is opposed to some flavor of XML or &amp;quot;tagged format&amp;quot; often used for display.&lt;br /&gt;
&lt;br /&gt;
3. Create a zebra.cfg file, and have it look something like this:&lt;br /&gt;
&lt;br /&gt;
  # global paths&lt;br /&gt;
  profilePath: .:./etc:/usr/local/share/idzebra-2.0/tab&lt;br /&gt;
  modulePath: /usr/local/lib/idzebra-2.0/modules&lt;br /&gt;
  &lt;br /&gt;
  # turn ranking on&lt;br /&gt;
  rank: rank-1&lt;br /&gt;
  &lt;br /&gt;
  # define a database of marc records called opac&lt;br /&gt;
  opac.database: opac&lt;br /&gt;
  opac.recordtype: grs.marcxml.marc21&lt;br /&gt;
  attset: bib1.att&lt;br /&gt;
  attset: explain.att&lt;br /&gt;
&lt;br /&gt;
4. Index your MARC records with the following command. You should  see lot's of great stuff sent to STDOUT.&lt;br /&gt;
&lt;br /&gt;
  zebraidx -g opac update &amp;lt;path to MARC records&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You have now created your index. Once you get this far with indexing, you will want to tweak various .abs files (I think) to enhance the indexing process. This particular thing is not my forte. It seems like black magic to most of us. This is not a Zebra-specific problem; this is a problem with Z39.50.&lt;br /&gt;
&lt;br /&gt;
Next, you need to implement the client/server end of things:&lt;br /&gt;
&lt;br /&gt;
5. Start your server. This will be a [[Z39.50]] server -- a &amp;quot;kewl&amp;quot;  library-centric protocol that existed before the Internet got hot:&lt;br /&gt;
&lt;br /&gt;
  zebrasrv localhost:9999 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
6. Use yaz-client to search your index:&lt;br /&gt;
&lt;br /&gt;
  $ yaz-client&lt;br /&gt;
  Z&amp;gt; open localhost:9999/opac&lt;br /&gt;
  Z&amp;gt; find origami&lt;br /&gt;
  Z&amp;gt; show 1&lt;br /&gt;
  Z&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
Using the yaz-client almost requires a knowledge of Z39.50. Attached should be a Perl script that allows you to search your server in a bit more user-friendly way. To use it you will need to install a few Perl modules and then edit the constant called DATABASE.&lt;br /&gt;
&lt;br /&gt;
Even though [[Z39.50]] is/was &amp;quot;kewl&amp;quot; it is still pretty icky. SRU is better -- definitely a step in the right direction, and Zebra supports SRU out of the box. [1]&lt;br /&gt;
&lt;br /&gt;
7. Create an an [[SRU]] configuration file looking something like this:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;yazgfs&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;&lt;br /&gt;
      &amp;lt;config&amp;gt;zebra.cfg&amp;lt;/config&amp;gt;&lt;br /&gt;
      &amp;lt;cql2rpn&amp;gt;pqf.properties&amp;lt;/cql2rpn&amp;gt;&lt;br /&gt;
    &amp;lt;/server&amp;gt;&lt;br /&gt;
  &amp;lt;/yazgfs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Acquire a &amp;quot;better&amp;quot; pqf.properties file. [[PQF]] is about querying Z39.50 databases. It is ugly. It was designed in a non-Internet world. Instead of knowing that 1=4 means search the title field, you want to simply search the title. Attached is a &amp;quot;better&amp;quot; pqf.properties file, and it is &amp;quot;better&amp;quot; because it maps things like 1=4 to Dublin Core equivalents. Save it in a directory called etc in the same directory as your zebra.cfg file. (Notice how the zebra.cfg file, above, denotes etc as being in zebra's path.)&lt;br /&gt;
&lt;br /&gt;
9. Kill your presently running Z39.50 server.&lt;br /&gt;
&lt;br /&gt;
10. Start up a SRU server:&lt;br /&gt;
&lt;br /&gt;
  zebrasrv -f sru.cfg localhost:9999 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
11. Use your HTTP client to search the SRU server. Queries will look like this:&lt;br /&gt;
&lt;br /&gt;
  http://localhost:9999/opac?operation=searchRetrieve&amp;amp;version=1.1&amp;amp;query=origami&amp;amp;maximumRecords=5&lt;br /&gt;
&lt;br /&gt;
The result should be a stream of XML ready for XSLT processing.&lt;br /&gt;
&lt;br /&gt;
All of the above is almost exactly what I did to create an index of MARC records harvested from the Library of Congress and the University of Michigan's OAI data repository (MBooks). [2] Take a look at the HTML source. Notice how the client in this regard is only one HTML file containing a form, one CSS file for style, and one XSL file for XML to HTML transformation.&lt;br /&gt;
&lt;br /&gt;
[1] SRU - http://www.loc.gov/standards/sru/&lt;br /&gt;
&lt;br /&gt;
[2] Example SRU interface - http://infomotions.com/ii/&lt;br /&gt;
&lt;br /&gt;
Appendix A: opac.pl&lt;br /&gt;
&lt;br /&gt;
  #!/usr/bin/perl&lt;br /&gt;
  &lt;br /&gt;
  # opac.pl - a simple z39.50 client&lt;br /&gt;
  &lt;br /&gt;
  # Eric Lease Morgan &amp;lt;emorgan@nd.edu&amp;gt;&lt;br /&gt;
  # 2007-06-05 - based on previous work with ZOOM Perl&lt;br /&gt;
  &lt;br /&gt;
  # require&lt;br /&gt;
  use MARC::Record;&lt;br /&gt;
  use strict;&lt;br /&gt;
  use ZOOM;&lt;br /&gt;
  &lt;br /&gt;
  # define&lt;br /&gt;
  use constant DATABASE =&amp;gt; 'wilson.infomotions.com:9999/ii';   # test server&lt;br /&gt;
  &lt;br /&gt;
  # get the query&lt;br /&gt;
  my $query = shift;&lt;br /&gt;
  &lt;br /&gt;
  # sanity check&lt;br /&gt;
  if ( ! $query ) {&lt;br /&gt;
  &lt;br /&gt;
  print &amp;quot;Usage: $0 query\n&amp;quot;;&lt;br /&gt;
  exit;&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # create an connection and search&lt;br /&gt;
  my $connection = new ZOOM::Connection( DATABASE, 0, count =&amp;gt; 1, preferredRecordSyntax =&amp;gt; &amp;quot;usmarc&amp;quot; );&lt;br /&gt;
  my $results = $connection-&amp;gt;search_pqf( qq[$query] );&lt;br /&gt;
  &lt;br /&gt;
  # loop through the first 50 hits results&lt;br /&gt;
  my $index = 0;&lt;br /&gt;
  for my $i ( 0 .. 49 ) {&lt;br /&gt;
  &lt;br /&gt;
  # get the record&lt;br /&gt;
  my $record = $results-&amp;gt;record( $i )-&amp;gt;raw;&lt;br /&gt;
  my $marc = MARC::Record-&amp;gt;new_from_usmarc( $record );&lt;br /&gt;
  &lt;br /&gt;
  # extract some data&lt;br /&gt;
  my $author = $marc-&amp;gt;author;&lt;br /&gt;
  my $title  = $marc-&amp;gt;title_proper;&lt;br /&gt;
  my $date   = $marc-&amp;gt;publication_date;&lt;br /&gt;
  &lt;br /&gt;
  # display&lt;br /&gt;
  print &amp;quot;   author: $author\n&amp;quot;;&lt;br /&gt;
  print &amp;quot;    title: $title\n&amp;quot;;&lt;br /&gt;
  print &amp;quot;     date: $date\n&amp;quot;;&lt;br /&gt;
  print &amp;quot;\n&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Appendix B: pqf.properties&lt;br /&gt;
&lt;br /&gt;
   # $Id: pqf.properties,v 1.13 2006/09/20 10:12:29 mike Exp $&lt;br /&gt;
  #&lt;br /&gt;
  # Propeties file to drive org.z3950.zing.cql.CQLNode's toPQF()&lt;br /&gt;
  # back-end and the YAZ CQL-to-PQF converter.  This specifies the&lt;br /&gt;
  # interpretation of various CQL indexes, relations, etc. in terms&lt;br /&gt;
  # of Type-1 query attributes.&lt;br /&gt;
  #&lt;br /&gt;
  # This configuration file generates queries using BIB-1 attributes.&lt;br /&gt;
  # See http://www.loc.gov/z3950/agency/zing/cql/dc-indexes.html&lt;br /&gt;
  # for the Maintenance Agency's work-in-progress mapping of Dublin Core&lt;br /&gt;
  # indexes to Attribute Architecture (util, XD and BIB-2)&lt;br /&gt;
  # attributes.&lt;br /&gt;
  &lt;br /&gt;
  # Identifiers for prefixes used in this file. (index.*)&lt;br /&gt;
  set.cql  = info:srw/cql-context-set/1/cql-v1.1&lt;br /&gt;
  set.rec  = info:srw/cql-context-set/2/rec-1.1&lt;br /&gt;
  set.dc   = info:srw/cql-context-set/1/dc-v1.1&lt;br /&gt;
  set.bath = http://zing.z3950.org/cql/bath/2.0/&lt;br /&gt;
  &lt;br /&gt;
  # The default set when an index doesn't specify one: Dublin Core&lt;br /&gt;
  set = info:srw/cql-context-set/1/dc-v1.1&lt;br /&gt;
  &lt;br /&gt;
  # The default index when none is specified by the query&lt;br /&gt;
  index.cql.serverChoice      = 1=any 2=102&lt;br /&gt;
  index.cql.allRecords        = 1=_ALLRECORDS 2=103&lt;br /&gt;
  index.rec.id                = 1=12&lt;br /&gt;
  index.dc.title              = 1=title 2=102&lt;br /&gt;
  index.dc.subject            = 1=subject 2=102&lt;br /&gt;
  index.dc.creator            = 1=1003 2=102&lt;br /&gt;
  index.dc.author             = 1=author 2=102&lt;br /&gt;
  index.dc.editor             = 1=1020&lt;br /&gt;
  index.dc.publisher          = 1=publisher&lt;br /&gt;
  index.dc.description        = 1=62&lt;br /&gt;
  index.dc.date               = 1=30&lt;br /&gt;
  index.dc.resourceType       = 1=1031&lt;br /&gt;
  index.dc.format             = 1=1034&lt;br /&gt;
  index.dc.resourceIdentifier = 1=key&lt;br /&gt;
  index.dc.source             = 1=1019&lt;br /&gt;
  index.dc.language           = 1=54&lt;br /&gt;
  index.dc.relation           = 1=?&lt;br /&gt;
  index.dc.coverage           = 1=?&lt;br /&gt;
  index.dc.rights             = 1=?&lt;br /&gt;
  &lt;br /&gt;
  # Relation attributes are selected according to the CQL relation by&lt;br /&gt;
  # looking up the &amp;quot;relation.&amp;lt;relation&amp;gt;&amp;quot; property:&lt;br /&gt;
  #&lt;br /&gt;
  relation.&amp;lt;     = 2=1&lt;br /&gt;
  relation.le    = 2=2&lt;br /&gt;
  relation.eq    = 2=3&lt;br /&gt;
  relation.exact = 2=3&lt;br /&gt;
  relation.ge    = 2=4&lt;br /&gt;
  relation.&amp;gt;     = 2=5&lt;br /&gt;
  relation.&amp;lt;&amp;gt;    = 2=6&lt;br /&gt;
  &lt;br /&gt;
  # These two are what Zebra uses -- may not work on other servers&lt;br /&gt;
  relation.all = 4=6&lt;br /&gt;
  relation.any = 4=105&lt;br /&gt;
  &lt;br /&gt;
  # BIB-1 doesn't have a server choice relation, so we just make the&lt;br /&gt;
  # choice here, and use equality (which is clearly correct).&lt;br /&gt;
  relation.scr = 2=3&lt;br /&gt;
  &lt;br /&gt;
  # Relation modifiers.&lt;br /&gt;
  relationModifier.relevant = 2=102&lt;br /&gt;
  relationModifier.fuzzy    = 5=103&lt;br /&gt;
  relationModifier.stem     = 2=101&lt;br /&gt;
  relationModifier.phonetic = 2=100&lt;br /&gt;
  &lt;br /&gt;
  # Non-standard extensions to provoke Zebra's inline sorting&lt;br /&gt;
  relationModifier.sort			= 7=1&lt;br /&gt;
  relationModifier.sort-desc		= 7=2&lt;br /&gt;
  relationModifier.numeric		= 4=109&lt;br /&gt;
  &lt;br /&gt;
  # Position attributes may be specified for anchored terms (those&lt;br /&gt;
  # beginning with &amp;quot;^&amp;quot;, which is stripped) and unanchored (those not&lt;br /&gt;
  # beginning with &amp;quot;^&amp;quot;).  This may change when we get a BIB-1 truncation&lt;br /&gt;
  # attribute that says &amp;quot;do what CQL does&amp;quot;.&lt;br /&gt;
  position.first        = 3=1 6=1&lt;br /&gt;
  position.any          = 3=3 6=1&lt;br /&gt;
  position.last         = 3=4 6=1&lt;br /&gt;
  position.firstAndLast = 3=3 6=3&lt;br /&gt;
  &lt;br /&gt;
  # Structure attributes may be specified for individual relations; a&lt;br /&gt;
  # default structure attribute my be specified by the pseudo-relation&lt;br /&gt;
  # &amp;quot;*&amp;quot;, to be used whenever a relation not listed here occurs.&lt;br /&gt;
  #&lt;br /&gt;
  structure.exact = 4=108&lt;br /&gt;
  structure.all   = 4=2&lt;br /&gt;
  structure.any   = 4=2&lt;br /&gt;
  structure.*     = 4=1&lt;br /&gt;
  &lt;br /&gt;
  # Truncation attributes used to implement CQL wildcard patterns.  The&lt;br /&gt;
  # simpler forms, left, right- and both-truncation will be used for the&lt;br /&gt;
  # simplest patterns, so that we produce PQF queries that conform more&lt;br /&gt;
  # closely to the Bath Profile.  However, when a more complex pattern&lt;br /&gt;
  # such as &amp;quot;foo*bar&amp;quot; is used, we fall back on Z39.58-style masking.&lt;br /&gt;
  truncation.right  = 5=1&lt;br /&gt;
  truncation.left   = 5=2&lt;br /&gt;
  truncation.both   = 5=3&lt;br /&gt;
  truncation.none   = 5=100&lt;br /&gt;
  truncation.regexp = 5=102&lt;br /&gt;
  truncation.z3958  = 5=104&lt;br /&gt;
  &lt;br /&gt;
  # Finally, any additional attributes that should always be included&lt;br /&gt;
  # with each term can be specified in the &amp;quot;always&amp;quot; property.&lt;br /&gt;
  always = 6=1&lt;br /&gt;
  &lt;br /&gt;
  # Bath Profile support, added Thu Dec 18 13:06:20 GMT 2003&lt;br /&gt;
  # See the Bath Profile for SRW at&lt;br /&gt;
  #	http://zing.z3950.org/cql/bath.html&lt;br /&gt;
  # including the Bath Context Set defined within that document.&lt;br /&gt;
  #&lt;br /&gt;
  # In this file, we only map index-names to BIB-1 use attributes, doing&lt;br /&gt;
  # so in accordance with the specifications of the Z39.50 Bath Profile,&lt;br /&gt;
  # and leaving the relations, wildcards, etc. to fend for themselves.&lt;br /&gt;
  &lt;br /&gt;
  index.bath.keyTitle			   = 1=33&lt;br /&gt;
  index.bath.possessingInstitution = 1=1044&lt;br /&gt;
  index.bath.name                  = 1=1002&lt;br /&gt;
  index.bath.personalName          = 1=1&lt;br /&gt;
  index.bath.corporateName         = 1=2&lt;br /&gt;
  index.bath.conferenceName        = 1=3&lt;br /&gt;
  index.bath.uniformTitle          = 1=6&lt;br /&gt;
  index.bath.isbn                  = 1=7&lt;br /&gt;
  index.bath.issn                  = 1=8&lt;br /&gt;
  index.bath.geographicName        = 1=58&lt;br /&gt;
  index.bath.notes                 = 1=63&lt;br /&gt;
  index.bath.topicalSubject        = 1=1079&lt;br /&gt;
  index.bath.genreForm             = 1=1075&lt;br /&gt;
  &lt;br /&gt;
  ## From: marc &amp;lt;marc@indexdata.dk&amp;gt;&lt;br /&gt;
  ## Date: December 20, 2006 9:55:24 AM EST&lt;br /&gt;
  ## To: Zebra Information Server &amp;lt;zebralist@lists.indexdata.dk&amp;gt;&lt;br /&gt;
  ## Subject: Re: [Zebralist] pqf.properties&lt;br /&gt;
  ## Reply-To: Zebra Information Server &amp;lt;zebralist@lists.indexdata.dk&amp;gt;&lt;br /&gt;
  ## &lt;br /&gt;
  ## Eric Lease Morgan wrote:&lt;br /&gt;
  ## &amp;gt; On Dec 19, 2006, at 4:45 PM, marc wrote:&lt;br /&gt;
  ## &amp;gt;&amp;gt;&amp;gt; How do I edit pqf.properties so I can get zebra to search my  &lt;br /&gt;
  ## &amp;gt;&amp;gt;&amp;gt; indexes via SRU?&lt;br /&gt;
  ## &amp;gt;&amp;gt;&amp;gt; I suppose I get this because etc/pqf.properties does not know  &lt;br /&gt;
  ## &amp;gt;&amp;gt;&amp;gt; about my field names.&lt;br /&gt;
  ## &amp;gt;&amp;gt;&lt;br /&gt;
  ## &amp;gt;&amp;gt; Right.&lt;br /&gt;
  ## &amp;gt;&amp;gt;&lt;br /&gt;
  ## &amp;gt;&amp;gt; The CQL-to-PQF conversion configuration has always been a bit of a  &lt;br /&gt;
  ## &amp;gt;&amp;gt; hassle, and I'd really like this to improve.&lt;br /&gt;
  ## &amp;gt;&amp;gt;&lt;br /&gt;
  ## &amp;gt;&amp;gt; The problem is, of course, that one needs to type the same index  &lt;br /&gt;
  ## &amp;gt;&amp;gt; names over-and-over again in different parts of the zebra configs.&lt;br /&gt;
  ## &amp;gt; Maybe I could work the other way around.&lt;br /&gt;
  ## &amp;gt; For example, how might I re-write my alvis indexing XSLT file so  &lt;br /&gt;
  ## &amp;gt; they conform to the pqf.properties file that comes with the Zebra  &lt;br /&gt;
  ## &amp;gt; distribution? Specifically, how might I change the value of the  &lt;br /&gt;
  ## &amp;gt; name attribute below so I could use CQL and search by title:&lt;br /&gt;
  ## &amp;gt;   &amp;lt;xsl:template match=&amp;quot;rdf:RDF/rdf:Description/dc:Title&amp;quot;&amp;gt;&lt;br /&gt;
  ## &amp;gt;     &amp;lt;z:index name=&amp;quot;title&amp;quot; type=&amp;quot;w&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;lt;/ &lt;br /&gt;
  ## &amp;gt; z:index&amp;gt;&lt;br /&gt;
  ## &amp;gt;   &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
  ## &lt;br /&gt;
  ## The crucial part is that the CQLtoPQF config file needs to hit an  &lt;br /&gt;
  ## existing index.&lt;br /&gt;
  ## &lt;br /&gt;
  ## so the lines and&lt;br /&gt;
  ## &lt;br /&gt;
  ## index.dc.title                          = 1=4&lt;br /&gt;
  ##   &amp;lt;z:index name=&amp;quot;title&amp;quot; type=&amp;quot;w&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;lt;/z:index&amp;gt;&lt;br /&gt;
  ## &lt;br /&gt;
  ## need to match&lt;br /&gt;
  ## &lt;br /&gt;
  ## If string indexes are used, easiest is to correct the standard config  &lt;br /&gt;
  ## file to&lt;br /&gt;
  ## &lt;br /&gt;
  ## index.dc.title                          = 1=title&lt;br /&gt;
  ## &lt;br /&gt;
  ## and so forth. The numeric value '4' refers to the specific bib-1  &lt;br /&gt;
  ## numeric attribute set, and is more confusion than help, so I suggest  &lt;br /&gt;
  ## you stick to your own defined string index names.&lt;br /&gt;
  ## &lt;br /&gt;
  ## In addition, you have to take into account if the indexes are of type  &lt;br /&gt;
  ## 'p', 'w', '0' or otherwise specified.&lt;br /&gt;
  ## &lt;br /&gt;
  ## so for  example:&lt;br /&gt;
  ##   &amp;lt;z:index name=&amp;quot;thisandthat&amp;quot; type=&amp;quot;p&amp;quot;&amp;gt;...&amp;lt;/z:index&amp;gt;&lt;br /&gt;
  ## &lt;br /&gt;
  ## would be&lt;br /&gt;
  ## index.dc.something = 1=thisandthat 6=3&lt;br /&gt;
  ## &lt;br /&gt;
  ## and&lt;br /&gt;
  ##   &amp;lt;z:index name=&amp;quot;thisandthat&amp;quot; type=&amp;quot;0&amp;quot;&amp;gt;...&amp;lt;/z:index&amp;gt;&lt;br /&gt;
  ## would be&lt;br /&gt;
  ## index.dc.something = 1=thisandthat 4=3&lt;br /&gt;
  ## &lt;br /&gt;
  ## The reason why this is so complex is that people often want only to  &lt;br /&gt;
  ## provide a subset of functionality to CQL queries, and therefore those  &lt;br /&gt;
  ## are independent config files.&lt;br /&gt;
  ## &lt;br /&gt;
  ## A better view of the way PQF queries are mapped to zebra indexes is  &lt;br /&gt;
  ## here:&lt;br /&gt;
  ## &lt;br /&gt;
  ## http://www.indexdata.com/zebra/doc/querymodel-zebra.tkl#querymodel- &lt;br /&gt;
  ## pqf-apt-mapping&lt;br /&gt;
  ## &lt;br /&gt;
  ## section:&lt;br /&gt;
  ## Mapping of PQF APT structure and completeness to register type&lt;br /&gt;
  ## &lt;br /&gt;
  ## and you need to run a PQF query to test that at least this part  &lt;br /&gt;
  ## works, before attempting a CQL-to-PQF query conversion.&lt;br /&gt;
  ## &lt;br /&gt;
  ## &lt;br /&gt;
  ## So, the way to build a working config is:&lt;br /&gt;
  ## &lt;br /&gt;
  ## 1) define your indexing rues in the indexation stylesheet&lt;br /&gt;
  ## i.e define and index with&lt;br /&gt;
  ## &lt;br /&gt;
  ##   &amp;lt;z:index name=&amp;quot;thisandthat&amp;quot; type=&amp;quot;0&amp;quot;&amp;gt;...&amp;lt;/z:index&amp;gt;&lt;br /&gt;
  ## &lt;br /&gt;
  ## &lt;br /&gt;
  ## 2) test that you worked out the correct PQF queries to acces them  &lt;br /&gt;
  ## using the above mentioned documentation section.&lt;br /&gt;
  ## &lt;br /&gt;
  ## i.e test&lt;br /&gt;
  ## Z&amp;gt; querytype prefix&lt;br /&gt;
  ## Z&amp;gt; scan attr 1=thisandthat @attr 4=3 aterm&lt;br /&gt;
  ## &lt;br /&gt;
  ## 3) showel that query into the right hand side of the index  &lt;br /&gt;
  ## definitions of the CQL to PQF converter&lt;br /&gt;
  ## &lt;br /&gt;
  ## write&lt;br /&gt;
  ## index.dc.something = 1=thisandthat 4=3&lt;br /&gt;
  ## &lt;br /&gt;
  ## &lt;br /&gt;
  ## 4) test that the CQL is performed correctly&lt;br /&gt;
  ## &lt;br /&gt;
  ## test (yes, yaz-client can send CQL queries)&lt;br /&gt;
  ## Z&amp;gt; querytype cql&lt;br /&gt;
  ## Z&amp;gt; scan dc.title=aterm&lt;br /&gt;
  ## &lt;br /&gt;
  ## -- &lt;br /&gt;
  ## Marc Cromme&lt;br /&gt;
  ## M.Sc and Ph.D in Mathematical Modelling and Computation&lt;br /&gt;
  ## Senior Developer, Project Manager&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericleasemorgan|Eric Lease Morgan]] 10:24, 18 June 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
[[Category: Zebra]]&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	</feed>