From ccdbb508a4ff4632970d6be7afb2fb330a2d51e0 Mon Sep 17 00:00:00 2001
From: Katrin Fischer <katrin.fischer.83@web.de>
Date: Thu, 17 Sep 2020 11:25:15 +0000
Subject: [PATCH] Bug 15436: Use semicolon between series name and volume

MARC21 dictates that we should be using a ; before $v in 440, 490,
810, 811 and 830.

This patch also introduces some additional changes to unify formatting
between the various options for cataloguing series:

- The separator between multiple series is switched form ; to the
  now commonly used | with a class for easy change of formatting.
- There was some missing logic that prevented the separator to show
  up correctly between traced and untraced series.
- For some series $v was included in the link for others not. Now
  $v always appears as text and only $a is linked, as this is what
  we actually search for.

To test this:
- You should be cataloguing multiple series in different ways, using
  - deprecated 440 (still present in old data)
  - 490, Ind. 1 = empty or 0 = not traced
  - 490, Ind. 1 = 1 = traced in combination with an 8xx field

Example (you should try a different combination!)
440 _ _ $aFirst series
490 _ _ $aSecond series ;$v1
490 1 _ $aThird series ;$v1 (this won't show, it will use 830 for display)
830 _ _ $aThird series ;$v1

Without patch:
Series: First Series; Second series ; 1Third series: 1

With patch:
Series: First series | Second series ; 1 | Third series ; 1

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
---
 .../prog/en/xslt/MARC21slimUtils.xsl          | 36 ++++++++++-----
 .../bootstrap/en/xslt/MARC21slimUtils.xsl     | 44 ++++++++++++-------
 2 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl b/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl
index bf3671fbce7..e228e771573 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl
+++ b/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl
@@ -416,19 +416,22 @@
             <xsl:call-template name="chopPunctuation">
                             <xsl:with-param name="chopString">
                                 <xsl:call-template name="subfieldSelect">
-                                    <xsl:with-param name="codes">av</xsl:with-param>
+                                    <xsl:with-param name="codes">a</xsl:with-param>
                                 </xsl:call-template>
                             </xsl:with-param>
                         </xsl:call-template>
             </a>
             <xsl:call-template name="part"/>
+            <xsl:if test="marc:subfield[@code='v']">
+                <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+            </xsl:if>
             <xsl:choose>
                 <xsl:when test="position()=last()">
                     <xsl:if test="../marc:datafield[@tag=490][@ind1!=1]">
-                        <xsl:text>; </xsl:text>
+                        <span class="separator"> | </span>
                     </xsl:if>
                 </xsl:when>
-                <xsl:otherwise><xsl:text> ; </xsl:text></xsl:otherwise>
+                <xsl:otherwise><span class="separator"> | </span></xsl:otherwise>
             </xsl:choose>
         </xsl:for-each>
 
@@ -438,13 +441,23 @@
                         <xsl:call-template name="chopPunctuation">
                             <xsl:with-param name="chopString">
                                 <xsl:call-template name="subfieldSelect">
-                                    <xsl:with-param name="codes">av</xsl:with-param>
+                                    <xsl:with-param name="codes">a</xsl:with-param>
                                 </xsl:call-template>
                             </xsl:with-param>
                         </xsl:call-template>
             </a>
-                    <xsl:call-template name="part"/>
-        <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+            <xsl:call-template name="part"/>
+            <xsl:if test="marc:subfield[@code='v']">
+                <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+            </xsl:if>
+            <xsl:choose>
+                <xsl:when test="position()=last()">
+                    <xsl:if test="../marc:datafield[@tag=490][@ind1!=1]">
+                        <span class="separator"> | </span>
+                    </xsl:if>
+                </xsl:when>
+                <xsl:otherwise><span class="separator"> | </span></xsl:otherwise>
+            </xsl:choose>
         </xsl:for-each>
         <!-- 490 Series traced, Ind1 = 1 -->
         <xsl:if test="marc:datafield[@tag=490][@ind1=1]">
@@ -485,9 +498,9 @@
                         <xsl:call-template name="part"/>
                     </xsl:otherwise>
                 </xsl:choose>
-                <xsl:text>: </xsl:text>
+                <xsl:text> ; </xsl:text>
                 <xsl:value-of  select="marc:subfield[@code='v']" />
-            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><span class="separator"> | </span></xsl:otherwise></xsl:choose>
             </xsl:for-each>
 
             <xsl:for-each select="marc:datafield[@tag=830]">
@@ -527,9 +540,10 @@
                         <xsl:call-template name="part"/>
                     </xsl:otherwise>
                 </xsl:choose>
-                <xsl:text>: </xsl:text>
-                <xsl:value-of  select="marc:subfield[@code='v']" />
-            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+                <xsl:if test="marc:subfield[@code='v']">
+                    <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+                </xsl:if>
+            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><span class="separator"> | </span></xsl:otherwise></xsl:choose>
             </xsl:for-each>
         </xsl:if>
 
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slimUtils.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slimUtils.xsl
index c7e13cefa31..eb380379db8 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slimUtils.xsl
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slimUtils.xsl
@@ -377,22 +377,25 @@
         <!-- 440 -->
         <xsl:for-each select="marc:datafield[@tag=440]">
             <a><xsl:attribute name="href"><xsl:value-of select="$searchurl"/>?q=se,phr:"<xsl:value-of select="str:encode-uri(marc:subfield[@code='a'], true())"/>"</xsl:attribute>
-            <xsl:call-template name="chopPunctuation">
-                            <xsl:with-param name="chopString">
-                                <xsl:call-template name="subfieldSelect">
-                                    <xsl:with-param name="codes">av</xsl:with-param>
-                                </xsl:call-template>
-                            </xsl:with-param>
+                <xsl:call-template name="chopPunctuation">
+                    <xsl:with-param name="chopString">
+                        <xsl:call-template name="subfieldSelect">
+                            <xsl:with-param name="codes">av</xsl:with-param>
                         </xsl:call-template>
+                    </xsl:with-param>
+                </xsl:call-template>
             </a>
             <xsl:call-template name="part"/>
+            <xsl:if test="marc:subfield[@code='v']">
+                <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+            </xsl:if>
             <xsl:choose>
                 <xsl:when test="position()=last()">
                     <xsl:if test="../marc:datafield[@tag=490][@ind1!=1]">
-                        <xsl:text>; </xsl:text>
+                        <span class="separator"> | </span>
                     </xsl:if>
                 </xsl:when>
-                <xsl:otherwise><xsl:text> ; </xsl:text></xsl:otherwise>
+                <xsl:otherwise><span class="separator"> | </span></xsl:otherwise>
             </xsl:choose>
         </xsl:for-each>
 
@@ -402,13 +405,23 @@
                         <xsl:call-template name="chopPunctuation">
                             <xsl:with-param name="chopString">
                                 <xsl:call-template name="subfieldSelect">
-                                    <xsl:with-param name="codes">av</xsl:with-param>
+                                    <xsl:with-param name="codes">a</xsl:with-param>
                                 </xsl:call-template>
                             </xsl:with-param>
                         </xsl:call-template>
             </a>
-                    <xsl:call-template name="part"/>
-        <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+            <xsl:call-template name="part"/>
+            <xsl:if test="marc:subfield[@code='v']">
+                <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+            </xsl:if>
+            <xsl:choose>
+                <xsl:when test="position()=last()">
+                    <xsl:if test="../marc:datafield[@tag=490][@ind1=1]">
+                        <span class="separator"> | </span>
+                    </xsl:if>
+                </xsl:when>
+                <xsl:otherwise><span class="separator"> | </span></xsl:otherwise>
+            </xsl:choose>
         </xsl:for-each>
         <!-- 490 Series traced, Ind1 = 1 -->
         <xsl:if test="marc:datafield[@tag=490][@ind1=1]">
@@ -451,7 +464,7 @@
                 </xsl:choose>
                 <xsl:text>: </xsl:text>
                 <xsl:value-of  select="marc:subfield[@code='v']" />
-            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><span class="separator"> | </span></xsl:otherwise></xsl:choose>
             </xsl:for-each>
 
             <xsl:for-each select="marc:datafield[@tag=830]">
@@ -491,9 +504,10 @@
                         <xsl:call-template name="part"/>
                     </xsl:otherwise>
                 </xsl:choose>
-                <xsl:text>: </xsl:text>
-                <xsl:value-of  select="marc:subfield[@code='v']" />
-            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+                <xsl:if test="marc:subfield[@code='v']">
+                    <xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='v']" />
+                </xsl:if>
+            <xsl:choose><xsl:when test="position()=last()"><xsl:text></xsl:text></xsl:when><xsl:otherwise><span class="separator"> | </span></xsl:otherwise></xsl:choose>
             </xsl:for-each>
         </xsl:if>
 
-- 
2.28.0