From 9cee1080f87442934f931423533e34696c6deab9 Mon Sep 17 00:00:00 2001
From: Magnus Enger <magnus@enger.priv.no>
Date: Thu, 16 Feb 2012 12:07:35 +0100
Subject: [PATCH] Bug 7537 - Implement TraceCompleteSubfields and TraceSubjectSubdivisions for NORMARC XSLT
Content-Type: text/plain; charset="utf-8"

As the title says, this patch implements TraceCompleteSubfields and
TraceSubjectSubdivisions for NORMARC XSLT, both for the OPAC and the
Intranet. This affects how clickable subject-links are constructed.

To make this work the indexing of MARC fields in the 600 range is changed
to include "Subject:p" in several new places.

To test:

Find a record with a complex subject, like "Art -- United States".
MARC21 and NORMARC are very similar in how they handle subjects, so testing
on a MARC21 database should be OK. (Changes in indexing reflect changes already
made to the MARC21 indexing.)

Make sure you have these syspref settings:
- marcflavour = NORMARC
- XSLTDetailsDisplay = using XSLT stylesheets
- OPACXSLTDetailsDisplay = using XSLT stylesheets

Now try the different combinations of TraceCompleteSubfields and
TraceSubjectSubdivisions and check the format of the clickable links,
both in the OPAC and staff client. Here's what you should be seeing:

1.
TraceCompleteSubfields   = Don't force
TraceSubjectSubdivisions = Don't include
Query: q=su:{Art}

2.
TraceCompleteSubfields   = Force
TraceSubjectSubdivisions = Don't include
Query: q=su,complete-subfield:{Art}

3.
TraceCompleteSubfields   = Don't force
TraceSubjectSubdivisions = Include
Query: q=(su:{Art}) and (su:{United%20States.})

4.
TraceCompleteSubfields   = Force
TraceSubjectSubdivisions = Include
Query: q=(su,complete-subfield:{Art}) and (su,complete-subfield:{United States.})
---
 etc/zebradb/marc_defs/normarc/biblios/record.abs   |   36 ++++++++++----------
 .../prog/en/xslt/NORMARCslim2intranetDetail.xsl    |   26 +++++++++++---
 .../prog/en/xslt/NORMARCslimUtils.xsl              |    4 ++-
 .../prog/en/xslt/NORMARCslim2OPACDetail.xsl        |   31 +++++++++++++----
 .../opac-tmpl/prog/en/xslt/NORMARCslimUtils.xsl    |    4 ++-
 5 files changed, 69 insertions(+), 32 deletions(-)

diff --git a/etc/zebradb/marc_defs/normarc/biblios/record.abs b/etc/zebradb/marc_defs/normarc/biblios/record.abs
index 5f6ede7..b1e4d1d 100644
--- a/etc/zebradb/marc_defs/normarc/biblios/record.abs
+++ b/etc/zebradb/marc_defs/normarc/biblios/record.abs
@@ -180,25 +180,25 @@ melm 520        Abstract:w,Abstract:p
 #melm 533$d     pubdate,pubdate:s
 #melm 541$d     Date-of-acquisition,Date-of-acquisition:s
 
-melm 600$a      Name-and-title,Name,Personal-name,Subject-name-personal,Subject
-melm 600$t      Name-and-title,Title,Subject
+melm 600$a      Name-and-title,Name,Personal-name,Subject-name-personal,Subject,Subject:p
+melm 600$t      Name-and-title,Title,Subject,Subject:p
 melm 600$9      Koha-Auth-Number
 #melm 600       Name,Personal-name,Subject-heading,Subject-name-personal
-melm 600        Name,Personal-name,Subject-name-personal,Subject
-melm 610$a      Name-and-title
-melm 610$t      Name-and-title,Title
+melm 600        Name,Personal-name,Subject-name-personal,Subject,Subject:p
+melm 610$a      Name-and-title,Subject,Subject:p
+melm 610$t      Name-and-title,Title,Subject,Subject:p
 melm 610$9      Koha-Auth-Number
-melm 610        Name,Subject,Corporate-name
-melm 611        Conference-name
-melm 611$a      Name-and-title
-melm 611$t      Name-and-title,Title
+melm 610        Name,Subject,Corporate-name,Subject,Subject:p
+melm 611        Conference-name,Subject,Subject:p
+melm 611$a      Name-and-title,Subject,Subject:p
+melm 611$t      Name-and-title,Title,Subject,Subject:p
 melm 611$9      Koha-Auth-Number
-melm 611        Name,Subject
-melm 630$i      Thematic-number
-melm 630$n      Thematic-number
-melm 630$r      Music-key
+melm 611        Name,Subject,Subject:p
+melm 630$i      Thematic-number,Subject,Subject:p
+melm 630$n      Thematic-number,Subject,Subject:p
+melm 630$r      Music-key,Subject,Subject:p
 melm 630$9      Koha-Auth-Number
-melm 630        Subject
+melm 630        Subject,Subject:p
 melm 650$9      Koha-Auth-Number    
 melm 650        Subject,Subject:p
 melm 651$9      Koha-Auth-Number    
@@ -208,13 +208,13 @@ melm 652$9      Koha-Auth-Number
 melm 653$9      Koha-Auth-Number    
 melm 653        Subject,Subject:p
 melm 654$9      Koha-Auth-Number    
-melm 654        Subject
+melm 654        Subject,Subject:p
 melm 655$9      Koha-Auth-Number    
-melm 655        Subject
+melm 655        Subject,Subject:p
 melm 656$9      Koha-Auth-Number    
-melm 656        Subject
+melm 656        Subject,Subject:p
 melm 657$9      Koha-Auth-Number    
-melm 657        Subject
+melm 657        Subject,Subject:p
 melm 690$9      Koha-Auth-Number    
 melm 690        Subject,Subject:p
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslim2intranetDetail.xsl b/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslim2intranetDetail.xsl
index 163ed29..5650099 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslim2intranetDetail.xsl
+++ b/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslim2intranetDetail.xsl
@@ -15,6 +15,8 @@
 
         <!-- Sysprefs -->
         <xsl:variable name="OPACBaseURL" select="marc:sysprefs/marc:syspref[@name='OPACBaseURL']"/>
+        <xsl:variable name="SubjectModifier"><xsl:if test="marc:sysprefs/marc:syspref[@name='TraceCompleteSubfields']='1'">,complete-subfield</xsl:if></xsl:variable>
+        <xsl:variable name="TraceSubjectSubdivisions" select="marc:sysprefs/marc:syspref[@name='TraceSubjectSubdivisions']"/>
 
         <xsl:variable name="leader" select="marc:leader"/>
         <xsl:variable name="leader6" select="substring($leader,7,1)"/>
@@ -293,16 +295,29 @@
         </span>
         </xsl:if>
 
+        <!-- Subjects -->
+
         <xsl:if test="marc:datafield[substring(@tag, 1, 1) = '6']">
-            <span class="results_summary"><span class="label">Emner: </span>
+            <span class="results_summary subjects"><span class="label">Emne(r): </span>
             <xsl:for-each select="marc:datafield[substring(@tag, 1, 1) = '6']">
             <a>
             <xsl:choose>
-            <xsl:when test="marc:subfield[@code=9]">
-                <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
+            <!-- Will implement this later
+                <xsl:when test="marc:subfield[@code=9] and $UseAuthoritiesForTracings='1'">
+                    <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
+                </xsl:when>
+            -->
+            <xsl:when test="$TraceSubjectSubdivisions='1'">
+                <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=<xsl:call-template name="subfieldSelect">
+                        <xsl:with-param name="codes">abcdvxyz</xsl:with-param>
+                        <xsl:with-param name="delimeter"> and </xsl:with-param>
+                        <xsl:with-param name="prefix">(su<xsl:value-of select="$SubjectModifier"/>:{</xsl:with-param>
+                        <xsl:with-param name="suffix">})</xsl:with-param>
+                    </xsl:call-template>
+                </xsl:attribute>
             </xsl:when>
             <xsl:otherwise>
-                <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=su:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
+                <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=su<xsl:value-of select="$SubjectModifier"/>:{<xsl:value-of select="marc:subfield[@code='a']"/>}</xsl:attribute>
             </xsl:otherwise>
             </xsl:choose>
             <xsl:call-template name="chopPunctuation">
@@ -313,7 +328,8 @@
                         <xsl:with-param name="subdivDelimiter">-- </xsl:with-param>
                     </xsl:call-template>
                 </xsl:with-param>
-            </xsl:call-template></a>
+            </xsl:call-template>
+            </a>
             <xsl:choose>
             <xsl:when test="position()=last()"></xsl:when>
             <xsl:otherwise> | </xsl:otherwise>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslimUtils.xsl b/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
index 7c2bf21..606727e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
+++ b/koha-tmpl/intranet-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
@@ -24,13 +24,15 @@
 		<xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
 		<xsl:param name="subdivCodes"/>
 		<xsl:param name="subdivDelimiter"/>
+        <xsl:param name="prefix"/>
+        <xsl:param name="suffix"/>
 		<xsl:variable name="str">
 			<xsl:for-each select="marc:subfield">
 				<xsl:if test="contains($codes, @code)">
                     <xsl:if test="contains($subdivCodes, @code)">
                         <xsl:value-of select="$subdivDelimiter"/>
                     </xsl:if>
-					<xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+					<xsl:value-of select="$prefix"/><xsl:value-of select="text()"/><xsl:value-of select="$suffix"/><xsl:value-of select="$delimeter"/>
 				</xsl:if>
 			</xsl:for-each>
 		</xsl:variable>
diff --git a/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslim2OPACDetail.xsl b/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslim2OPACDetail.xsl
index 19cee91..b5f0500 100644
--- a/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslim2OPACDetail.xsl
+++ b/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslim2OPACDetail.xsl
@@ -15,8 +15,11 @@
     </xsl:template>
 
     <xsl:template match="marc:record">
-
-    <xsl:variable name="DisplayOPACiconsXSLT" select="marc:sysprefs/marc:syspref[@name='DisplayOPACiconsXSLT']"/>
+    
+        <!-- Sysprefs -->
+        <xsl:variable name="SubjectModifier"><xsl:if test="marc:sysprefs/marc:syspref[@name='TraceCompleteSubfields']='1'">,complete-subfield</xsl:if></xsl:variable>
+        <xsl:variable name="TraceSubjectSubdivisions" select="marc:sysprefs/marc:syspref[@name='TraceSubjectSubdivisions']"/>
+        <xsl:variable name="DisplayOPACiconsXSLT" select="marc:sysprefs/marc:syspref[@name='DisplayOPACiconsXSLT']"/>
 
         <xsl:variable name="leader" select="marc:leader"/>
         <xsl:variable name="leader6" select="substring($leader,7,1)"/>
@@ -301,16 +304,29 @@
         </span>
         </xsl:if>
 
+        <!-- Subjects -->
+        
         <xsl:if test="marc:datafield[substring(@tag, 1, 1) = '6']">
-            <span class="results_summary"><span class="label">Emner: </span>
+            <span class="results_summary subjects"><span class="label">Emne(r): </span>
             <xsl:for-each select="marc:datafield[substring(@tag, 1, 1) = '6']">
             <a>
             <xsl:choose>
-            <xsl:when test="marc:subfield[@code=9]">
-                <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
+            <!-- Will implement this later
+                <xsl:when test="marc:subfield[@code=9] and $UseAuthoritiesForTracings='1'">
+                    <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
+                </xsl:when>
+            -->
+            <xsl:when test="$TraceSubjectSubdivisions='1'">
+                <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=<xsl:call-template name="subfieldSelect">
+                        <xsl:with-param name="codes">abcdvxyz</xsl:with-param>
+                        <xsl:with-param name="delimeter"> and </xsl:with-param>
+                        <xsl:with-param name="prefix">(su<xsl:value-of select="$SubjectModifier"/>:{</xsl:with-param>
+                        <xsl:with-param name="suffix">})</xsl:with-param>
+                    </xsl:call-template>
+                </xsl:attribute>
             </xsl:when>
             <xsl:otherwise>
-                <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=su:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
+                <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=su<xsl:value-of select="$SubjectModifier"/>:{<xsl:value-of select="marc:subfield[@code='a']"/>}</xsl:attribute>
             </xsl:otherwise>
             </xsl:choose>
             <xsl:call-template name="chopPunctuation">
@@ -321,7 +337,8 @@
                         <xsl:with-param name="subdivDelimiter">-- </xsl:with-param>
                     </xsl:call-template>
                 </xsl:with-param>
-            </xsl:call-template></a>
+            </xsl:call-template>
+            </a>
             <xsl:choose>
             <xsl:when test="position()=last()"></xsl:when>
             <xsl:otherwise> | </xsl:otherwise>
diff --git a/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslimUtils.xsl b/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
index 31317b1..91a0437 100644
--- a/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
+++ b/koha-tmpl/opac-tmpl/prog/en/xslt/NORMARCslimUtils.xsl
@@ -25,13 +25,15 @@
 		<xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
 		<xsl:param name="subdivCodes"/>
 		<xsl:param name="subdivDelimiter"/>
+        <xsl:param name="prefix"/>
+        <xsl:param name="suffix"/>
 		<xsl:variable name="str">
 			<xsl:for-each select="marc:subfield">
 				<xsl:if test="contains($codes, @code)">
                     <xsl:if test="contains($subdivCodes, @code)">
                         <xsl:value-of select="$subdivDelimiter"/>
                     </xsl:if>
-					<xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
+					<xsl:value-of select="$prefix"/><xsl:value-of select="text()"/><xsl:value-of select="$suffix"/><xsl:value-of select="$delimeter"/>
 				</xsl:if>
 			</xsl:for-each>
 		</xsl:variable>
-- 
1.7.2.5

