From 769e47060eeb2362c73f5acad0f4fd912410eaf7 Mon Sep 17 00:00:00 2001
From: Tomas Cohen Arazi <tomascohen@gmail.com>
Date: Thu, 4 Sep 2014 13:11:07 -0300
Subject: [PATCH] Bug 11232: Add new syntax for facets definition on
koha-indexdefs-to-zebra.xsl
This patch changes koha-indexdefs-to-zebra.xsl to correctly process a new syntax
for defining facet indexes on the XML files.
It also changes the retrieval file to allow access to Zebra's internal data from
Zoom (i.e. access to zebra::facet:*).
Sponsored-by: Universidad Nacional de Cordoba
---
debian/templates/marc21-retrieval-info-bib-dom.xml | 2 +
.../templates/normarc-retrieval-info-bib-dom.xml | 2 +
.../templates/unimarc-retrieval-info-bib-dom.xml | 2 +
etc/zebradb/retrieval-info-bib-dom.xml | 7 ++
etc/zebradb/xsl/koha-indexdefs-to-zebra.xsl | 96 ++++++++++++++++++++--
5 files changed, 104 insertions(+), 5 deletions(-)
diff --git a/debian/templates/marc21-retrieval-info-bib-dom.xml b/debian/templates/marc21-retrieval-info-bib-dom.xml
index 7e45f38..c7ce0ac 100644
--- a/debian/templates/marc21-retrieval-info-bib-dom.xml
+++ b/debian/templates/marc21-retrieval-info-bib-dom.xml
@@ -14,9 +14,11 @@
outputcharset="utf-8"/>
</backend>
</retrieval>
+ <retrieval syntax="xml"/>
<retrieval syntax="xml" name="index"/> <!-- allow viewing index entries -->
<retrieval syntax="xml" name="marc"
identifier="info:srw/schema/1/marcxml-v1.1"/>
<retrieval syntax="xml" name="marcxml"
identifier="info:srw/schema/1/marcxml-v1.1"/>
+ <retrieval syntax="xml" name="zebra::*" />
</retrievalinfo>
diff --git a/debian/templates/normarc-retrieval-info-bib-dom.xml b/debian/templates/normarc-retrieval-info-bib-dom.xml
index f723f9a..9d62631 100644
--- a/debian/templates/normarc-retrieval-info-bib-dom.xml
+++ b/debian/templates/normarc-retrieval-info-bib-dom.xml
@@ -14,9 +14,11 @@
outputcharset="utf-8"/>
</backend>
</retrieval>
+ <retrieval syntax="xml"/>
<retrieval syntax="xml" name="index"/> <!-- allow viewing index entries -->
<retrieval syntax="xml" name="marc"
identifier="info:srw/schema/1/marcxml-v1.1"/>
<retrieval syntax="xml" name="marcxml"
identifier="info:srw/schema/1/marcxml-v1.1"/>
+ <retrieval syntax="xml" name="zebra::*" />
</retrievalinfo>
diff --git a/debian/templates/unimarc-retrieval-info-bib-dom.xml b/debian/templates/unimarc-retrieval-info-bib-dom.xml
index 941f8e8..7699dc5 100644
--- a/debian/templates/unimarc-retrieval-info-bib-dom.xml
+++ b/debian/templates/unimarc-retrieval-info-bib-dom.xml
@@ -14,9 +14,11 @@
outputcharset="utf-8"/>
</backend>
</retrieval>
+ <retrieval syntax="xml"/>
<retrieval syntax="xml" name="index"/> <!-- allow viewing index entries -->
<retrieval syntax="xml" name="marc"
identifier="info:srw/schema/1/marcxml-v1.1"/>
<retrieval syntax="xml" name="marcxml"
identifier="info:srw/schema/1/marcxml-v1.1"/>
+ <retrieval syntax="xml" name="zebra::*" />
</retrievalinfo>
diff --git a/etc/zebradb/retrieval-info-bib-dom.xml b/etc/zebradb/retrieval-info-bib-dom.xml
index c966937..4fe781d 100644
--- a/etc/zebradb/retrieval-info-bib-dom.xml
+++ b/etc/zebradb/retrieval-info-bib-dom.xml
@@ -15,4 +15,11 @@
</backend>
</retrieval>
<retrieval syntax="xml"/>
+ <retrieval syntax="xml" name="index"/> <!-- allow viewing index entries -->
+ <retrieval syntax="xml" name="marc"
+ identifier="info:srw/schema/1/marcxml-v1.1"/>
+ <retrieval syntax="xml" name="marcxml"
+ identifier="info:srw/schema/1/marcxml-v1.1"/>
+<!-- enable access to Zebra's internal data -->
+ <retrieval syntax="xml" name="zebra::*" />
</retrievalinfo>
diff --git a/etc/zebradb/xsl/koha-indexdefs-to-zebra.xsl b/etc/zebradb/xsl/koha-indexdefs-to-zebra.xsl
index 1488b1c..ddef62e 100644
--- a/etc/zebradb/xsl/koha-indexdefs-to-zebra.xsl
+++ b/etc/zebradb/xsl/koha-indexdefs-to-zebra.xsl
@@ -12,10 +12,10 @@
<xsl:template match="text()"/>
<!-- Keys on tags referenced in the index definitions -->
- <xsl:key name="index_control_field_tag" match="kohaidx:index_control_field" use="@tag"/>
- <xsl:key name="index_subfields_tag" match="kohaidx:index_subfields" use="@tag"/>
- <xsl:key name="index_heading_tag" match="kohaidx:index_heading" use="@tag"/>
- <xsl:key name="index_data_field_tag" match="kohaidx:index_data_field" use="@tag"/>
+ <xsl:key name="index_control_field_tag" match="kohaidx:index_control_field" use="@tag"/>
+ <xsl:key name="index_subfields_tag" match="kohaidx:index_subfields" use="@tag"/>
+ <xsl:key name="index_heading_tag" match="kohaidx:index_heading" use="@tag"/>
+ <xsl:key name="index_data_field_tag" match="kohaidx:index_data_field" use="@tag"/>
<xsl:key name="index_heading_conditional_tag" match="kohaidx:index_heading_conditional" use="@tag"/>
<xsl:key name="index_match_heading_tag" match="kohaidx:index_match_heading" use="@tag"/>
@@ -33,6 +33,7 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
<xslo:template match="text()"/>
<xslo:template match="text()" mode="index_subfields"/>
<xslo:template match="text()" mode="index_data_field"/>
+ <xslo:template match="text()" mode="index_facets"/>
<xslo:template match="text()" mode="index_heading"/>
<xslo:template match="text()" mode="index_heading_conditional"/>
<xslo:template match="text()" mode="index_match_heading"/>
@@ -57,6 +58,7 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
<xslo:apply-templates/>
<xslo:apply-templates mode="index_subfields"/>
<xslo:apply-templates mode="index_data_field"/>
+ <xslo:apply-templates mode="index_facets"/>
<xslo:apply-templates mode="index_heading"/>
<xslo:apply-templates mode="index_heading_conditional"/>
<xslo:apply-templates mode="index_match_heading"/>
@@ -69,6 +71,7 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
<xsl:call-template name="handle-index-control-field"/>
<xsl:call-template name="handle-index-subfields"/>
<xsl:call-template name="handle-index-data-field"/>
+ <xsl:call-template name="handle-index-facets"/>
<xsl:call-template name="handle-index-heading"/>
<xsl:call-template name="handle-index-heading-conditional"/>
<xsl:call-template name="handle-index-match-heading"/>
@@ -104,7 +107,7 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
</xslo:variable>
</xsl:template>
- <xsl:template match="kohaidx:index_subject_thesaurus">
+ <xsl:template match="kohaidx:index_subject_thesaurus">
<xsl:variable name="tag"><xsl:value-of select="@tag"/></xsl:variable>
<xsl:variable name="offset"><xsl:value-of select="@offset"/></xsl:variable>
<xsl:variable name="length"><xsl:value-of select="@length"/></xsl:variable>
@@ -288,6 +291,36 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
</xslo:for-each>
</xsl:template>
+ <xsl:template name="handle-index-facets">
+ <xsl:for-each select="facet">
+ <xsl:variable name="indexes">
+ <xsl:call-template name="get-facets-target-indexes"/>
+ </xsl:variable>
+ <xsl:if test="not($indexes='')">
+ <xslo:template mode="index_facets">
+ <xsl:attribute name="match">
+ <xsl:text>marc:datafield[@tag='</xsl:text>
+ <xsl:value-of select="@tag"/>
+ <xsl:text>']</xsl:text>
+ </xsl:attribute>
+ <xslo:if>
+ <xsl:attribute name="test">
+ <xsl:text>not(@ind1='z')</xsl:text>
+ </xsl:attribute>
+ <z:index>
+ <xsl:attribute name="name">
+ <xsl:value-of select="normalize-space($indexes)"/>
+ </xsl:attribute>
+ <xsl:call-template name="build-facet-value">
+ <xsl:with-param name="subfields" select="@subfields"/>
+ </xsl:call-template>
+ </z:index>
+ </xslo:if>
+ </xslo:template>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+
<xsl:template name="handle-index-data-field">
<xsl:for-each select="//kohaidx:index_data_field[generate-id() = generate-id(key('index_data_field_tag', @tag)[1])]">
<xslo:template mode="index_data_field">
@@ -475,4 +508,57 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
<xsl:value-of select="." /><xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
+
+ <xsl:template name="get-facets-target-indexes">
+ <xsl:for-each select="target_index">
+ <xsl:value-of select="." /><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- traverse subfields string character-wise -->
+ <xsl:template name="build-facet-value">
+ <xsl:param name="subfields"/>
+ <xsl:if test="string-length($subfields) > 0">
+ <xslo:value-of>
+ <xsl:attribute name="select">
+ <xsl:text>marc:subfield[@code='</xsl:text>
+ <xsl:value-of select="substring($subfields,1,1)"/>
+ <xsl:text>']</xsl:text>
+ </xsl:attribute>
+ </xslo:value-of>
+ <xsl:call-template name="build-facet-value-cont">
+ <xsl:with-param name="prev" select="substring($subfields,1,1)"/>
+ <xsl:with-param name="subfields" select="substring($subfields,2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="build-facet-value-cont">
+ <xsl:param name="prev"/>
+ <xsl:param name="subfields"/>
+ <xsl:if test="string-length($subfields) > 0">
+ <xslo:if>
+ <xsl:attribute name="test">
+ <xsl:text>marc:subfield[@code='</xsl:text>
+ <xsl:value-of select="$prev"/>
+ <xsl:text>'] and marc:subfield[@code='</xsl:text>
+ <xsl:value-of select="substring($subfields,1,1)"/>
+ <xsl:text>']</xsl:text>
+ </xsl:attribute>
+ <xslo:text>::*::</xslo:text>
+ </xslo:if>
+ <xslo:value-of>
+ <xsl:attribute name="select">
+ <xsl:text>marc:subfield[@code='</xsl:text>
+ <xsl:value-of select="substring($subfields,1,1)"/>
+ <xsl:text>']</xsl:text>
+ </xsl:attribute>
+ </xslo:value-of>
+ <xsl:call-template name="build-facet-value-cont">
+ <xsl:with-param name="prev" select="substring($subfields,1,1)"/>
+ <xsl:with-param name="subfields" select="substring($subfields,2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
</xsl:stylesheet>
--
1.9.1