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'enfant "MusicStar"", + " 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 " " >]> + +<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, '˜œ슜슛슘슈슉','')"/> +<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, '˜œ슜슛슘슈슉','')"/> + <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 : </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 : </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 : </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 : </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="'
'" /> + <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é : </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 : </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é : </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