From 470a52eafdc5376ab1018bdad475100be570a5fa Mon Sep 17 00:00:00 2001
From: efalcy <efalcy@afi-sa.fr>
Date: Thu, 12 Sep 2019 17:56:38 +0200
Subject: [PATCH] hotline#95686 : break lines on xsl

---
 VERSIONS_HOTLINE/95686              |   1 +
 library/Class/Notice/Xsl.php        |   2 +-
 tests/scenarios/Xsl/XslTest.php     |  51 ++
 tests/scenarios/Xsl/break_line.xsl  | 803 ++++++++++++++++++++++++++++
 tests/scenarios/Xsl/notice_onde.txt |  21 +
 5 files changed, 877 insertions(+), 1 deletion(-)
 create mode 100644 VERSIONS_HOTLINE/95686
 create mode 100644 tests/scenarios/Xsl/break_line.xsl
 create mode 100644 tests/scenarios/Xsl/notice_onde.txt

diff --git a/VERSIONS_HOTLINE/95686 b/VERSIONS_HOTLINE/95686
new file mode 100644
index 00000000000..05baf0c2f1c
--- /dev/null
+++ b/VERSIONS_HOTLINE/95686
@@ -0,0 +1 @@
+ - ticket #95686 : [XSLT] Prise en charge des sauts de ligne dans les feuilles de style
\ No newline at end of file
diff --git a/library/Class/Notice/Xsl.php b/library/Class/Notice/Xsl.php
index e44e1bb3b4e..ac16ff255d1 100644
--- a/library/Class/Notice/Xsl.php
+++ b/library/Class/Notice/Xsl.php
@@ -88,7 +88,7 @@ class Class_Notice_Xsl {
       return '';
 
     return ($marc_xml_array = static::getYaz()->marcToMarcXml($marc))
-      ? static::getYaz()->writeMarcXmlInFile(implode($marc_xml_array))
+      ? static::getYaz()->writeMarcXmlInFile(implode("\n",$marc_xml_array))
       : '';
   }
 
diff --git a/tests/scenarios/Xsl/XslTest.php b/tests/scenarios/Xsl/XslTest.php
index 7deb87d935c..d184b1fa0d9 100644
--- a/tests/scenarios/Xsl/XslTest.php
+++ b/tests/scenarios/Xsl/XslTest.php
@@ -75,6 +75,57 @@ class XslRechercheControllerViewnoticeWithInspectorGadgetAndMarcXMLEnabledTest e
 
 
 
+class XslRechercheControllerViewnoticeAndMarcXMLWithLineBreaksTest extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+
+  /** @test */
+  public function writtenXmlShouldKeepNewLines() {
+    $profile = Class_Profil::getCurrentProfil();
+    $profile->setCfgModulesPreferences(['xslt' => '/tests/scenarios/Xsl/break_line.xsl'],
+                                       'recherche',
+                                       'viewnotice',
+                                       Class_TypeDoc::PERIODIQUE);
+    $profile->save();
+    $marcxml_output = [
+                       "    <subfield code=\"a\">Détail du contenu :",
+                       "  1 pochette contenant des instruments pour enfant",
+                       "  1 clavier d&apos;enfant &quot;MusicStar&quot;",
+                       "  1 flûte à bec",
+                       " </subfield>"
+    ];
+    $cmd = $this->mock()
+                ->whenCalled('exec')
+                ->answers(true)
+                ->whenCalled('getOutput')
+                ->answers($marcxml_output);
+
+    $filesystem = $this->mock()
+                       ->whenCalled('unlink')
+                       ->answers(true)
+
+                       ->whenCalled('file_put_contents')
+                       ->willDo(function($filename,$content) use ($marcxml_output)
+                                {
+                                  if (FALSE === strpos($filename,'.xml'))
+                                    return;
+                                  $this->assertEquals($marcxml_output, explode("\n",$content),$content);
+                                });
+    Class_Testing_Yaz::setCommand($cmd);
+    Class_Testing_Yaz::setFileSystem($filesystem);
+
+    $this->fixture('Class_Notice',
+                   ['id' => 2,
+                    'type_doc' => Class_TypeDoc::PERIODIQUE,
+                    'unimarc' => file_get_contents('tests/scenarios/Xsl/notice_onde.txt')]);
+    $this->dispatch('/opac/noticeajax/detail/id_notice/2', true);
+
+    $this->assertTrue($filesystem->methodHasBeenCalled('file_put_contents'));
+  }
+}
+
+
+
+
 class XslDocTypeConfigurationDispatchTest extends Admin_AbstractControllerTestCase {
   protected $_storm_default_to_volatile = true;
 
diff --git a/tests/scenarios/Xsl/break_line.xsl b/tests/scenarios/Xsl/break_line.xsl
new file mode 100644
index 00000000000..adc54beb5d8
--- /dev/null
+++ b/tests/scenarios/Xsl/break_line.xsl
@@ -0,0 +1,803 @@
+
+
+<!DOCTYPE stylesheet [<!ENTITY nbsp "&#160;" >]>
+
+<xsl:stylesheet version="1.0"
+  xmlns:marc="http://www.loc.gov/MARC21/slim"
+  xmlns:items="http://www.koha-community.org/items"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  exclude-result-prefixes="marc items">
+
+<xsl:output method = "html" indent="yes" omit-xml-declaration = "yes" encoding="UTF-8"/>
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<!-- debut du report de utils -->
+
+<xsl:template name="datafield">
+<xsl:param name="tag"/>
+<xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="subfields"/>
+<xsl:element name="datafield">
+<xsl:attribute name="tag">
+<xsl:value-of select="$tag"/>
+</xsl:attribute>
+<xsl:attribute name="ind1">
+<xsl:value-of select="$ind1"/>
+</xsl:attribute>
+<xsl:attribute name="ind2">
+<xsl:value-of select="$ind2"/>
+</xsl:attribute>
+<xsl:copy-of select="$subfields"/>
+</xsl:element>
+</xsl:template>
+
+
+<xsl:template name="replace_sab">
+    <!-- with string s, replace substring a by string b -->
+    <!-- s, a and b are parameters determined upon calling  -->
+    <xsl:param name="s" />
+    <xsl:param name="a" />
+    <xsl:param name="b" />
+    <xsl:choose>
+        <xsl:when test="contains($s,$a)">
+            <xsl:value-of select="substring-before($s,$a)" />
+            <xsl:copy-of select="$b" />
+            <xsl:call-template name="replace_sab">
+                <xsl:with-param name="s" select="substring-after($s,$a)" />
+                <xsl:with-param name="a" select="$a" />
+                <xsl:with-param name="b" select="$b" />
+            </xsl:call-template>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:value-of select="$s" />
+        </xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<xsl:template name="tag_215">
+<xsl:for-each select="marc:datafield[@tag=215]">
+<li>
+<strong>Collation : </strong>
+<xsl:if test="marc:subfield[@code='a']">
+<xsl:value-of select="marc:subfield[@code='a']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='c']"> : <xsl:value-of select="marc:subfield[@code='c']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='d']"> ; <xsl:value-of select="marc:subfield[@code='d']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='e']"> + <xsl:value-of select="marc:subfield[@code='e']"/>
+</xsl:if>
+</li>
+</xsl:for-each>
+</xsl:template>
+
+<!--Titre de serie autorité 461-->
+<xsl:template name="tag_461">
+<xsl:for-each select="marc:datafield[@tag=461]">
+<li>
+<strong>Titre de série : </strong>
+<xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='t']">
+ <a>
+   <xsl:attribute name="href">
+     <xsl:text>/recherche/simple/rech_titres/</xsl:text>
+     <xsl:value-of select="translate(marc:subfield[@code='t'], '*?()', '+')"/>
+   </xsl:attribute>
+   <xsl:value-of select="marc:subfield[@code='t']"/>
+ </a>
+ </xsl:if>
+<xsl:if test="marc:subfield[@code='e']"> :
+<xsl:value-of select="marc:subfield[@code='e']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='f']"> /
+<xsl:value-of select="marc:subfield[@code='f']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='d']"> ,
+<xsl:value-of select="marc:subfield[@code='d']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='p']"> ,
+<xsl:value-of select="marc:subfield[@code='p']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='v']">,
+<xsl:value-of select="marc:subfield[@code='v']"/>
+</xsl:if>
+</li>
+</xsl:for-each>
+</xsl:template>
+
+<!--Titre de serie non autorité 461-->
+<xsl:template name="tag_461bis">
+<xsl:for-each select="marc:datafield[@tag=461][1]">
+<li>
+<strong>Dans : </strong>
+<xsl:call-template name="addClassRtl" />
+<xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='t']">
+ <a>
+   <xsl:attribute name="href">
+     <xsl:text>/recherche/simple/rech_titres/</xsl:text>
+     <xsl:value-of select="translate(marc:subfield[@code='t'], '*?()', '+')"/>
+   </xsl:attribute>
+   <xsl:value-of select="marc:subfield[@code='t']"/>
+ </a>
+ </xsl:if>
+<xsl:if test="marc:subfield[@code='e']"> :
+<xsl:value-of select="marc:subfield[@code='e']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='f']"> /
+<xsl:value-of select="marc:subfield[@code='f']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='d']"> ,
+<xsl:value-of select="marc:subfield[@code='d']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='p']"> ,
+<xsl:value-of select="marc:subfield[@code='p']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='v']">,
+<xsl:value-of select="marc:subfield[@code='v']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='w']"> -
+<xsl:value-of select="marc:subfield[@code='w']"/>
+</xsl:if>
+</li>
+</xsl:for-each>
+</xsl:template>
+
+<!--Titre dépouillé 463-->
+<xsl:template name="tag_463">
+<xsl:for-each select="marc:datafield[@tag=463][1]">
+<li>
+<strong>Titre dépouillé : </strong>
+<xsl:call-template name="addClassRtl" />
+<xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='t']">
+ <a>
+   <xsl:attribute name="href">
+     <xsl:text>/recherche/simple/rech_titres/</xsl:text>
+     <xsl:value-of select="translate(marc:subfield[@code='t'], '*?()', '+')"/>
+   </xsl:attribute>
+   <xsl:value-of select="marc:subfield[@code='t']"/>
+ </a>
+ </xsl:if>
+<xsl:if test="marc:subfield[@code='e']"> :
+<xsl:value-of select="marc:subfield[@code='e']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='f']"> /
+<xsl:value-of select="marc:subfield[@code='f']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='d']"> ,
+<xsl:value-of select="marc:subfield[@code='d']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='p']"> ,
+<xsl:value-of select="marc:subfield[@code='p']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='v']">,
+<xsl:value-of select="marc:subfield[@code='v']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='w']"> -
+<xsl:value-of select="marc:subfield[@code='w']"/>
+</xsl:if>
+</li>
+</xsl:for-each>
+</xsl:template>
+
+<xsl:template name="tag_4xx">
+<xsl:param name="tag" />
+<xsl:param name="label" />
+<xsl:if test="marc:datafield[@tag=$tag]">
+<li>
+<strong><xsl:value-of select="$label" /> : </strong>
+<xsl:for-each select="marc:datafield[@tag=$tag]">
+<span>
+<xsl:call-template name="addClassRtl" />
+<xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='t']">
+ <a>
+   <xsl:attribute name="href">
+     <xsl:text>/recherche/simple/rech_titres/</xsl:text>
+     <xsl:value-of select="translate(marc:subfield[@code='t'], '*?()', '+')"/>
+   </xsl:attribute>
+   <xsl:value-of select="marc:subfield[@code='t']"/>
+ </a>
+ </xsl:if>
+<xsl:if test="marc:subfield[@code='c']"> : <xsl:value-of select="marc:subfield[@code='c']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='d']"> ; <xsl:value-of select="marc:subfield[@code='d']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='e'][1]"> - <xsl:value-of select="marc:subfield[@code='e'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='f'][1]"> - <xsl:value-of select="marc:subfield[@code='f'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='g'][1]"> - <xsl:value-of select="marc:subfield[@code='g'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='h'][1]"> - <xsl:value-of select="marc:subfield[@code='h'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='i'][1]"> - <xsl:value-of select="marc:subfield[@code='i'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='l'][1]"> - <xsl:value-of select="marc:subfield[@code='l'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='v'][1]"> , <xsl:value-of select="marc:subfield[@code='v'][1]"/>
+</xsl:if>
+</span>
+<xsl:if test="not (position() = last())">
+<xsl:text> ; </xsl:text>
+</xsl:if>
+</xsl:for-each>
+</li>
+</xsl:if>
+</xsl:template>
+
+
+<!--Public 995q-->
+<xsl:template name="public">
+<xsl:if test="marc:datafield[@tag=995]/marc:subfield[@code='q']">
+<li>
+<strong>Public : </strong>
+<xsl:for-each select="marc:datafield[@tag=995]/marc:subfield[@code='q']">
+<xsl:if test="position() = 1">
+<xsl:value-of select="." />
+</xsl:if></xsl:for-each>
+</li>
+</xsl:if>
+</xsl:template>
+
+<!--Fonds 995h-->
+<xsl:template name="fonds">
+<xsl:if test="marc:datafield[@tag=995]/marc:subfield[@code='h']">
+<li>
+<strong>Fonds :  </strong>
+<xsl:for-each select="marc:datafield[@tag=995]/marc:subfield[@code='h']">
+<xsl:if test="position() = 1">
+<xsl:value-of select="." />
+</xsl:if></xsl:for-each>
+</li>
+</xsl:if>
+</xsl:template>
+
+<xsl:template name="subfieldSelect">
+<xsl:param name="codes"/>
+<xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="subdivCodes"/>
+<xsl:param name="subdivDelimiter"/>
+<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:if>
+</xsl:for-each>
+</xsl:variable>
+<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+</xsl:template>
+
+<xsl:template name="buildSpaces">
+<xsl:param name="spaces"/>
+<xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
+<xsl:if test="$spaces>0">
+<xsl:value-of select="$char"/>
+<xsl:call-template name="buildSpaces">
+<xsl:with-param name="spaces" select="$spaces - 1"/>
+<xsl:with-param name="char" select="$char"/>
+</xsl:call-template>
+</xsl:if>
+</xsl:template>
+
+
+<xsl:template name="chopSpecialCharacters">
+<xsl:param name="title" />
+<xsl:variable name="ntitle"
+select="translate($title, '&#x0098;&#x009C;&#xC29C;&#xC29B;&#xC298;&#xC288;&#xC289;','')"/>
+<xsl:value-of select="$ntitle" />
+</xsl:template>
+
+<xsl:template name="chopPunctuation">
+<xsl:param name="chopString"/>
+<xsl:variable name="length" select="string-length($chopString)"/>
+<xsl:choose>
+<xsl:when test="$length=0"/>
+<xsl:when test="contains('.:,;/ ', substring($chopString,$length,1))">
+<xsl:call-template name="chopPunctuation">
+<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+</xsl:call-template>
+</xsl:when>
+<xsl:when test="not($chopString)"/>
+<xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
+</xsl:choose>
+<xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template name="addClassRtl">
+<xsl:variable name="lang" select="marc:subfield[@code='7']" />
+<xsl:if test="$lang = 'ha' or $lang = 'Hebrew' or $lang = 'fa' or $lang = 'Arabe'">
+<xsl:attribute name="class">rtl</xsl:attribute>
+</xsl:if>
+</xsl:template>
+
+<xsl:template name="tag_title">
+<xsl:param name="tag" />
+<xsl:param name="label" />
+<xsl:if test="marc:datafield[@tag=$tag]">
+<li>
+<strong><xsl:value-of select="$label"/>: </strong>
+<xsl:for-each select="marc:datafield[@tag=$tag]">
+<xsl:value-of select="marc:subfield[@code='a']" />
+<xsl:if test="marc:subfield[@code='d']">
+<xsl:text> : </xsl:text>
+<xsl:value-of select="marc:subfield[@code='e']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='e']">
+<xsl:for-each select="marc:subfield[@code='e']">
+<xsl:text> </xsl:text>
+<xsl:value-of select="."/>
+</xsl:for-each>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='f']">
+<xsl:text> / </xsl:text>
+<xsl:value-of select="marc:subfield[@code='f']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='h']">
+<xsl:text>, </xsl:text>
+<xsl:value-of select="marc:subfield[@code='h']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='i']">
+<xsl:text>, </xsl:text>
+<xsl:value-of select="marc:subfield[@code='i']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='v']">
+<xsl:text>, </xsl:text>
+<xsl:value-of select="marc:subfield[@code='v']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='x']">
+<xsl:text>, </xsl:text>
+<xsl:value-of select="marc:subfield[@code='x']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='z']">
+<xsl:text>, </xsl:text>
+<xsl:value-of select="marc:subfield[@code='z']"/>
+</xsl:if>
+</xsl:for-each>
+</li>
+</xsl:if>
+</xsl:template>
+
+
+ <xsl:template name="tag_subject">
+ <xsl:param name="tag" />
+ <xsl:param name="label" />
+ <xsl:if test="marc:datafield[@tag=$tag]">
+ <li>
+ <strong><xsl:value-of select="$label"/>: </strong>
+ <xsl:for-each select="marc:datafield[@tag=$tag]">
+ <a>
+ <xsl:attribute name="href">/recherche/simple/rech_matieres/<xsl:value-of select="translate(marc:subfield[@code='a'], '*?()', '+')"/></xsl:attribute>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdjpvxyz</xsl:with-param>
+ <xsl:with-param name="subdivCodes">jpxyz</xsl:with-param>
+ <xsl:with-param name="subdivDelimiter">-- </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ <xsl:if test="not (position()=last())">
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ </xsl:template>
+
+
+<xsl:template name="tag_7xx">
+ <xsl:param name="tag" />
+ <xsl:param name="label" />
+ <xsl:if test="marc:datafield[@tag=$tag]">
+ <p class="xslt4">
+ <xsl:for-each select="marc:datafield[@tag=$tag]">
+ <span>
+ <xsl:call-template name="addClassRtl" />
+ <a>
+ <xsl:attribute name="href">/recherche/simple/rech_auteurs/<xsl:value-of select="marc:subfield[@code='b']"/><xsl:text> </xsl:text><xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
+ <xsl:if test="marc:subfield[@code='a']">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='b']">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='b']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='c']">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='c']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='d']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='d']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='e']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='e']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='f']">
+ <span dir="ltr">
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="marc:subfield[@code='f']"/>
+ <xsl:text>)</xsl:text>
+ </span>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='g']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='g']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='p']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='p']"/>
+ </xsl:if>
+ </a>
+ <xsl:if test="marc:subfield[@code='4']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='4']"/>
+ </xsl:if>
+ </span>
+ <xsl:if test="not (position() = last())">
+ <xsl:text> ; </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+ </xsl:template>
+
+<!-- fin du report de utils -->
+
+<xsl:output method = "html" indent="yes" omit-xml-declaration = "yes" encoding="UTF-8"/>
+<xsl:template match="/">
+<xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="marc:record">
+<xsl:variable name="Show856uAsImage" select="marc:sysprefs/marc:syspref[@name='Display856uAsImage']"/>
+<xsl:variable name="leader" select="marc:leader"/>
+<xsl:variable name="leader6" select="substring($leader,7,1)"/>
+<xsl:variable name="leader7" select="substring($leader,8,1)"/>
+<xsl:variable name="biblionumber" select="marc:datafield[@tag=090]/marc:subfield[@code='a']"/>
+<xsl:variable name="champ_610" select="marc:datafield[@tag=610]/marc:subfield[@code='a']"/>
+<xsl:variable name="ppn" select="marc:controlfield[@tag=009]"/>
+<xsl:variable name="coverCD" select="marc:datafield[@tag=933]/marc:subfield[@code='a']"/>
+<xsl:variable name="type_doc" select="marc:datafield[@tag=099]/marc:subfield[@code='t']"/>
+<xsl:variable name="renvoi" select="marc:datafield[@tag=700]/@ind1"/>
+
+<!--
+<xsl:if test="marc:datafield[@tag=200]">
+<xsl:for-each select="marc:datafield[@tag=200]">
+<h1 id="xslt">
+<xsl:call-template name="addClassRtl" />
+<xsl:variable name="title" select="marc:subfield[@code='a']"/>
+<xsl:variable name="ntitle"
+select="translate($title, '&#x0098;&#x009C;&#xC29C;&#xC29B;&#xC298;&#xC288;&#xC289;','')"/>
+ <xsl:value-of select="marc:subfield[@code='a'][1]" />
+<xsl:if test="marc:subfield[@code='e'][1]"><xsl:text> : </xsl:text><xsl:value-of select="marc:subfield[@code='e'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='c'][1]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='c'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='d'][1]"><xsl:text> = </xsl:text><xsl:value-of select="marc:subfield[@code='d'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='h'][1]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='h'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='i'][1]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='i'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='e'][2]"><xsl:text> :</xsl:text><xsl:value-of select="marc:subfield[@code='e'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='c'][2]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='c'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='d'][2]"><xsl:text> = </xsl:text><xsl:value-of select="marc:subfield[@code='d'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='h'][2]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='h'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='i'][2]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='i'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='e'][3]"><xsl:text> : </xsl:text><xsl:value-of select="marc:subfield[@code='e'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='c'][3]"><xsl:text> .</xsl:text><xsl:value-of select="marc:subfield[@code='c'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='d'][3]"><xsl:text> = </xsl:text><xsl:value-of select="marc:subfield[@code='d'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='h'][3]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='h'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='i'][3]"><xsl:text> . </xsl:text><xsl:value-of select="marc:subfield[@code='i'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][2]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][3]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][3]" /></xsl:if>
+
+</h1>
+</xsl:for-each>
+</xsl:if>
+-->
+
+<!--
+<xsl:if test="not(contains($renvoi,'z'))">
+<xsl:call-template name="tag_7xx">
+<xsl:with-param name="tag">700</xsl:with-param>
+<xsl:with-param name="label"></xsl:with-param>
+</xsl:call-template>
+</xsl:if>
+
+<xsl:call-template name="tag_7xx">
+<xsl:with-param name="tag">710</xsl:with-param>
+<xsl:with-param name="label"></xsl:with-param>
+</xsl:call-template>
+
+<xsl:call-template name="tag_7xx">
+<xsl:with-param name="tag">701</xsl:with-param>
+<xsl:with-param name="label"></xsl:with-param>
+</xsl:call-template>
+
+<xsl:call-template name="tag_7xx">
+<xsl:with-param name="tag">702</xsl:with-param>
+<xsl:with-param name="label"></xsl:with-param>
+</xsl:call-template>
+
+<xsl:call-template name="tag_7xx">
+<xsl:with-param name="tag">711</xsl:with-param>
+<xsl:with-param name="label"></xsl:with-param>
+</xsl:call-template>
+
+ <xsl:call-template name="tag_7xx">
+ <xsl:with-param name="tag">712</xsl:with-param>
+ <xsl:with-param name="label"></xsl:with-param>
+ </xsl:call-template>
+
+-->
+
+<xsl:if test="marc:datafield[@tag=210]">
+ <p id="xslt3">
+ <xsl:for-each select="marc:datafield[@tag=210]">
+<strong>Edition&nbsp;: </strong>
+ <a>
+ <xsl:attribute name="href">/recherche/simple/rech_HEDIT/<xsl:value-of select="marc:subfield[@code='c']"/></xsl:attribute>
+<xsl:value-of select="marc:subfield[@code='c']"/>
+</a>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='d']"/>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+
+ <xsl:call-template name="tag_title">
+ <xsl:with-param name="tag">225</xsl:with-param>
+ <xsl:with-param name="label">Collection</xsl:with-param>
+ </xsl:call-template>
+
+<xsl:if test="marc:datafield[@tag=215]">
+ <p id="xslt4">
+ <xsl:for-each select="marc:datafield[@tag=215]">
+<strong>Description&nbsp;: </strong>
+<xsl:value-of select="marc:subfield[@code='c']"/>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+
+<xsl:if test="marc:datafield[@tag=215][e]">
+ <p id="xslt6">
+ <xsl:for-each select="marc:datafield[@tag=215]">
+<strong>Matériel complémentaire&nbsp;: </strong>
+<xsl:value-of select="marc:subfield[@code='e']"/>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+
+<xsl:if test="marc:datafield[@tag=300]">
+ <p id="xslt7">
+ <xsl:for-each select="marc:datafield[@tag=300]">
+<strong>Détail du contenu&nbsp;: </strong>
+<xsl:if test="marc:subfield[@code='a']">
+
+  <xsl:call-template name="replace_sab">
+    <xsl:with-param name="s" select="marc:subfield[@code='a']" />
+    <xsl:with-param name="a" select="'&#xA;'" />
+    <xsl:with-param name="b"><br /></xsl:with-param>
+  </xsl:call-template>
+
+</xsl:if>
+</xsl:for-each>
+ </p>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=462]">
+  <li>
+  <strong>Document rattaché&nbsp;: </strong>
+  <ul>
+ <xsl:for-each select="marc:datafield[@tag=462]">
+ <li>
+     <xsl:call-template name="addClassRtl" />
+  <xsl:if test="marc:subfield[@code='t']">
+  <a>
+    <xsl:attribute name="href">
+      <xsl:text>/recherche/simple/expressionRecherche/</xsl:text>
+      <xsl:value-of select="translate(marc:subfield[@code='0'], '*?()', '+')"/>
+    </xsl:attribute>
+    <xsl:value-of select="marc:subfield[@code='t']"/>
+  </a>
+  </xsl:if>
+  <xsl:if test="marc:subfield[@code='e']"> :
+  <xsl:value-of select="marc:subfield[@code='e']"/>
+  </xsl:if>
+  <xsl:if test="marc:subfield[@code='f']"> /
+  <xsl:value-of select="marc:subfield[@code='f']"/>
+  </xsl:if>
+  <xsl:if test="marc:subfield[@code='v']">,
+  <xsl:value-of select="marc:subfield[@code='v']"/>
+  </xsl:if>
+ </li>
+  </xsl:for-each>
+ </ul>
+
+  </li>
+ </xsl:if>
+
+<!--&&9 Subject - Name 600-->
+<xsl:for-each select="marc:datafield[@tag=600]">
+ <li>
+ <strong>Sujet&nbsp;: </strong>
+ <span>
+<xsl:if test="marc:subfield[@code='a']">
+    <xsl:value-of select="marc:subfield[@code='a']"/>
+       </xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='b']">
+<xsl:text>, </xsl:text>
+            <xsl:value-of select="marc:subfield[@code='b']"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='d']">
+<xsl:text>, </xsl:text>
+            <xsl:value-of select="marc:subfield[@code='d']"/>
+       </xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='c']">
+<xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='c']"/>
+       </xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='f']">
+<xsl:text> (</xsl:text>
+           <xsl:value-of select="marc:subfield[@code='f']"/>
+<xsl:text>) </xsl:text>       </xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='x']">
+<xsl:text> -- </xsl:text>
+           <xsl:value-of select="marc:subfield[@code='x'][1]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='x'][2]">
+<xsl:text> -- </xsl:text>
+<xsl:value-of select="marc:subfield[@code='x'][2]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='x'][3]">
+<xsl:text> -- </xsl:text>
+<xsl:value-of select="marc:subfield[@code='x'][3]"/>
+</xsl:if>
+<xsl:if test="marc:subfield[@code='a'] and  marc:subfield[@code='y']">
+<xsl:text> -- </xsl:text>
+           <xsl:value-of select="marc:subfield[@code='y']"/>
+       </xsl:if>
+
+</span>
+ </li>
+ </xsl:for-each>
+
+
+ <xsl:if test="marc:datafield[@tag=330]">
+ <p id="xslt2">
+ <strong>Résumé&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=330]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <xsl:choose>
+ <xsl:when test="position()=last()">
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <br></br><xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+
+<xsl:call-template name="tag_4xx">
+<xsl:with-param name="tag">464</xsl:with-param>
+<xsl:with-param name="label">Contenu</xsl:with-param>
+</xsl:call-template>
+
+
+<!--
+<xsl:if test="marc:datafield[@tag=210]">
+ <p id="xslt3">
+ <xsl:for-each select="marc:datafield[@tag=210]">
+ <xsl:value-of select="marc:subfield[@code='c']"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='d']"/>
+ </xsl:for-each>
+ </p>
+ </xsl:if>
+-->
+
+
+
+ </xsl:template>
+
+ <xsl:template name="nameABCDQ">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">aq</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="punctuation">
+ <xsl:text>:,;/ </xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="termsOfAddress"/>
+ </xsl:template>
+
+ <xsl:template name="nameABCDN">
+ <xsl:for-each select="marc:subfield[@code='a']">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="."/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:for-each select="marc:subfield[@code='b']">
+ <xsl:value-of select="."/>
+ </xsl:for-each>
+ <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">cdn</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="nameACDEQ">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">acdeq</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="termsOfAddress">
+ <xsl:if test="marc:subfield[@code='b' or @code='c']">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">bc</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="part">
+ <xsl:variable name="partNumber">
+ <xsl:call-template name="specialSubfieldSelect">
+ <xsl:with-param name="axis">n</xsl:with-param>
+ <xsl:with-param name="anyCodes">n</xsl:with-param>
+ <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="partName">
+ <xsl:call-template name="specialSubfieldSelect">
+ <xsl:with-param name="axis">p</xsl:with-param>
+ <xsl:with-param name="anyCodes">p</xsl:with-param>
+ <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="string-length(normalize-space($partNumber))">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="$partNumber"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="string-length(normalize-space($partName))">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="$partName"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="specialSubfieldSelect">
+ <xsl:param name="anyCodes"/>
+ <xsl:param name="axis"/>
+ <xsl:param name="beforeCodes"/>
+ <xsl:param name="afterCodes"/>
+ <xsl:variable name="str">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="contains($anyCodes, @code)      or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+ <xsl:value-of select="text()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/tests/scenarios/Xsl/notice_onde.txt b/tests/scenarios/Xsl/notice_onde.txt
new file mode 100644
index 00000000000..84c4de9b092
--- /dev/null
+++ b/tests/scenarios/Xsl/notice_onde.txt
@@ -0,0 +1,21 @@
+02466nam0a2200409   450 001000700000090001100007099001900018100004100037200002800078215022700106091000600333300062800339462002600967462004400993462004701037462005301084462005601137462007101193462003601264462002701300462004101327462005601368462005301424462004701477462004401524462002601568462002701594462007101621462003601692462004101728462004101769462003601810462007101846462002701917801001101944959010101955262312  a262312  tANIMuMALLEx0  a20190411d        dm|y0frey50      ba  aDe l'onde à la musique  aDimensions de la mallecDes instruments de musique ; du matériel pour des ateliers sur la communication ; des boîtes pour un memory sonore ; 1 maquette représentant une oreilled60 x 40 x 35 cmeDes fiches pédagogiques  a0  aDétail du contenu :
+  1 pochette contenant des instruments pour enfant
+  1 clavier d'enfant "MusicStar"
+  1 flûte à bec
+  4 diapasons + 1 maillet avec son support en bois
+   9 tubes PVC dans un sac papier kraft
+   2 serinettes dans une pochette plastique
+   1 manche de guitare dans une housse en velours dans son        carton d'origine
+   1 Ukulélé
+
+   6 gobelets 90 cl
+   2 gobelets reliés avec de la ficelle
+   50 gobelets 20 cl
+   12 gobelets 25 cl (en carton)
+   10 tasses à café 15 cl
+   1 pochette avec 2 bobines de fil, 1 paire de ciseaux 
+   4 épingles de sûreté
+   17 boîtes blanches
+    des livres
+
+  tLe son0808659135567  tLes sons en 150 questions057753995092  tExpériences avec les sons01629349291944  tLe labo des sons et des lumières0887439149824  tDans mes oreilles, j'entends le monde013948920248  t100 activités scientifiques pour apprendre autrement08953911087  tMaxi kézako ? 50852489143795  tLe son01850799334727  tLes secrets des sons01084949185926  tDans mes oreilles, j'entends le monde013948920248  tLe labo des sons et des lumières0887439149824  tExpériences avec les sons01629349291944  tLes sons en 150 questions057753995092  tLe son0808659135567  tLe son01850799334727  t100 activités scientifiques pour apprendre autrement08953911087  tMaxi kézako ? 50852489143795  tLes secrets des sons01084949185926  tLes secrets des sons01084949185926  tMaxi kézako ? 50852489143795  t100 activités scientifiques pour apprendre autrement08953911087  tLe son01850799334727  aFrance  rhttps://mediatheque-koha-opac.aube.fr/cgi-bin/koha/opac-image.pl?thumbnail=1&biblionumber=262312
-- 
GitLab