From 281fb393f22d565622ca591addba3fba1325dd02 Mon Sep 17 00:00:00 2001
From: gloas <gloas@afi-sa.fr>
Date: Thu, 12 Apr 2018 11:01:12 +0200
Subject: [PATCH] dev #73871 start implementing xslt

---
 .../opac/controllers/NoticeajaxController.php |    7 +-
 library/Class/Notice/Xsl.php                  |   74 +
 library/Class/Testing/Abstract.php            |    3 +-
 library/Class/Testing/FileSystem.php          |    3 +-
 library/Class/Testing/PhpCommand.php          |   27 +
 library/Trait/StaticPhpCommand.php            |   36 +
 library/ZendAfi/View/Helper/Notice/Xsl.php    |   36 +
 tests/scenarios/Xsl/XslTest.php               |   15 +-
 tests/scenarios/Xsl/record_description.xsl    | 1337 +++++++++++++++++
 9 files changed, 1531 insertions(+), 7 deletions(-)
 create mode 100644 library/Class/Notice/Xsl.php
 create mode 100644 library/Class/Testing/PhpCommand.php
 create mode 100644 library/Trait/StaticPhpCommand.php
 create mode 100644 library/ZendAfi/View/Helper/Notice/Xsl.php
 create mode 100644 tests/scenarios/Xsl/record_description.xsl

diff --git a/application/modules/opac/controllers/NoticeajaxController.php b/application/modules/opac/controllers/NoticeajaxController.php
index 0b22ce8582e..e967bccbe08 100644
--- a/application/modules/opac/controllers/NoticeajaxController.php
+++ b/application/modules/opac/controllers/NoticeajaxController.php
@@ -160,7 +160,12 @@ class NoticeAjaxController extends Zend_Controller_Action {
       return;
     }
 
-    $this->_sendResponseWithScripts($this->view->notice_Entete($notice, ['entete' => Class_Codification::CHAMPS]));
+    $xsl = (new Class_Notice_Xsl($notice, Class_Profil::getCurrentProfil()));
+    $html = $xsl->isEnabled()
+      ? $this->view->Notice_Xsl($xsl)
+      : $this->view->notice_Entete($notice, ['entete' => Class_Codification::CHAMPS]);
+
+    $this->_sendResponseWithScripts($html);
   }
 
 
diff --git a/library/Class/Notice/Xsl.php b/library/Class/Notice/Xsl.php
new file mode 100644
index 00000000000..c8b8764ceb8
--- /dev/null
+++ b/library/Class/Notice/Xsl.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Class_Notice_Xsl {
+  use Trait_StaticPhpCommand;
+
+  protected
+    $_record,
+    $_profile,
+    $_xsl_file;
+
+
+  public function __construct($record, $profile) {
+    $this->_record = $record;
+    $this->_profile = $profile;
+    $this->_xsl_file = $this->_getXslFileFromProfile();
+  }
+
+
+  public function isEnabled() {
+    if(!static::getPhpCommand()->extension_loaded('xsl'))
+      return false;
+
+    if(!$this->_record)
+      return false;
+
+    if(!$this->_profile)
+      return false;
+
+    if(!$this->getXslFile())
+      return false;
+
+    return true;
+  }
+
+
+  public function getXslFile() {
+    return $this->_xsl_file;
+  }
+
+
+  protected function _getXslFileFromProfile() {
+    $settings = $this->_profile->getCfgModulesPreferences('recherche', 'viewnotice', $this->_record->getTypeDoc());
+    if(!$settings)
+      return;
+
+    if(empty($settings))
+      return;
+
+    if(!array_key_exists('xsl', $settings))
+      return;
+
+    return $settings['xsl'];
+  }
+}
\ No newline at end of file
diff --git a/library/Class/Testing/Abstract.php b/library/Class/Testing/Abstract.php
index d6c2f4a9067..78a4d0c4e67 100644
--- a/library/Class/Testing/Abstract.php
+++ b/library/Class/Testing/Abstract.php
@@ -29,5 +29,4 @@ abstract class Class_Testing_Abstract {
       throw new RuntimeException($this->_error . $name);
     return @call_user_func_array($name, $args);
   }
-}
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/library/Class/Testing/FileSystem.php b/library/Class/Testing/FileSystem.php
index 535978d386a..7c83ae6a180 100644
--- a/library/Class/Testing/FileSystem.php
+++ b/library/Class/Testing/FileSystem.php
@@ -30,5 +30,4 @@ class Class_Testing_FileSystem extends Class_Testing_Abstract {
      'is_readable', 'file_put_contents', 'filesize'
     ],
     $_error = 'Call to unknown fileSystem method ';
-}
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/library/Class/Testing/PhpCommand.php b/library/Class/Testing/PhpCommand.php
new file mode 100644
index 00000000000..455626d40aa
--- /dev/null
+++ b/library/Class/Testing/PhpCommand.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class Class_Testing_PhpCommand extends Class_Testing_FileSystem {
+  public function __construct() {
+    $this->_known_functions = array_merge($this->_known_functions,
+                                          ['extension_loaded']);
+  }
+}
\ No newline at end of file
diff --git a/library/Trait/StaticPhpCommand.php b/library/Trait/StaticPhpCommand.php
new file mode 100644
index 00000000000..e12c482ffc2
--- /dev/null
+++ b/library/Trait/StaticPhpCommand.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+trait Trait_StaticPhpCommand {
+  protected static $_phpCommand;
+
+  public static function setPhpCommand($phpCommand) {
+    self::$_phpCommand = $phpCommand;
+  }
+
+
+  public static function getPhpCommand() {
+    if (null !== self::$_phpCommand)
+      return self::$_phpCommand;
+    return new Class_Testing_PhpCommand();
+  }
+}
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/Notice/Xsl.php b/library/ZendAfi/View/Helper/Notice/Xsl.php
new file mode 100644
index 00000000000..c7cf20e201b
--- /dev/null
+++ b/library/ZendAfi/View/Helper/Notice/Xsl.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class ZendAfi_View_Helper_Notice_Xsl extends ZendAfi_View_Helper_BaseHelper {
+  public function Notice_Xsl($xsl) {
+    $xsl_doc = new DOMDocument();
+    $xsl_doc->load($xsl->getXslFile());
+
+    $xml = new DOMDocument();
+    $xml->load($xsl->getMarcXml());
+
+    $xslt = new XSLTProcessor();
+    $xslt->importStylesheet($xsl_doc);
+
+    return $xslt->transformToXml($xml);
+  }
+}
\ No newline at end of file
diff --git a/tests/scenarios/Xsl/XslTest.php b/tests/scenarios/Xsl/XslTest.php
index 304b100e72b..eee08703b34 100644
--- a/tests/scenarios/Xsl/XslTest.php
+++ b/tests/scenarios/Xsl/XslTest.php
@@ -61,13 +61,24 @@ class XslNoticeajaxDetailDispatchTest extends AbstractControllerTestCase {
   public function setUp() {
     parent::setUp();
 
+    $php_command = $this->mock()
+                        ->whenCalled('extension_loaded')
+                        ->answers(true);
+
+    Class_Notice_Xsl::setPhpCommand($php_command);
+
     $profile = Class_Profil::getCurrentProfil();
+    $profile->setCfgModulesPreferences(['xsl' => 'tests/scenarios/Xsl/record_description.xsl'],
+                                       'recherche',
+                                       'viewnotice',
+                                       '1');
+    $profile->save();
 
     $this->fixture('Class_Notice',
                    ['id' => 5,
-                    '']);
+                    'type_doc' => 1]);
 
-    $this->dispatch('/opac/recherche/noticeajax/detail/id_notice/5', true);
+    $this->dispatch('/opac/noticeajax/detail/id_notice/5', true);
   }
 
 
diff --git a/tests/scenarios/Xsl/record_description.xsl b/tests/scenarios/Xsl/record_description.xsl
new file mode 100644
index 00000000000..5c08983ff25
--- /dev/null
+++ b/tests/scenarios/Xsl/record_description.xsl
@@ -0,0 +1,1337 @@
+
+
+<!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="tag_099">
+<xsl:if test="marc:datafield[@tag=099]">
+ <br/><li>
+ <strong>Informations locales&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=099]">
+ <xsl:if test="marc:subfield[@code='a']">
+ <li><strong> <xsl:text>Créateur : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='a']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='b']">
+ <li><strong> <xsl:text>Dernier modificateur : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='b']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='c']">
+ <li><strong> <xsl:text>Date de création : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='c']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='d']">
+ <li><strong> <xsl:text>Date de modification : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='d']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='e']">
+ <li><strong> <xsl:text>Export BDSP : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='e']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='f']">
+ <li><strong> <xsl:text>Base d'origine : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='f']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='g']">
+ <li><strong> <xsl:text>Code de centre BDSP : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='g']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='s']">
+ <li><strong> <xsl:text>Périodique : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='s']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='t']">
+ <li><strong> <xsl:text>Type de document : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='t']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='u']">
+ <li><strong> <xsl:text>Type de BO : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='u']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='y']">
+ <li><strong> <xsl:text>Secteur thématique : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='y']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='z']">
+ <li><strong> <xsl:text>IBO : </xsl:text></strong>
+ <xsl:for-each select="marc:subfield[@code='z']">
+ <xsl:value-of select="text()"/><xsl:text> </xsl:text>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="position()=last()">
+ <br/>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> ; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="tag_210">
+ <xsl:for-each select="marc:datafield[@tag=210]">
+ <li>
+ <strong>Publication&nbsp;: </strong>
+ <span>
+ <xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='a']">
+ <xsl:for-each select="marc:subfield[@code='a']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='b']">
+ <xsl:if test="marc:subfield[@code='a']">, </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='b']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='c']">
+ <xsl:if test="marc:subfield[@code='a']"> : </xsl:if>
+ <xsl:for-each select="marc:subfield[@code='c']">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='d']">
+ <xsl:if test="marc:subfield[@code='a' or @code='c']">, </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='d']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='e']">
+ <xsl:if test="marc:subfield[@code='a' or @code='c' or @code='d']"> - </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='e']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='g']">
+ <xsl:if test="marc:subfield[@code='e']"> : </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='g']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='h']">
+ <xsl:if test="marc:subfield[@code='e' or @code='g']">, </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='h']"/>
+ </xsl:if>
+ <xsl:if test="not (position() = last())">
+ <xsl:text> • </xsl:text>
+ </xsl:if>
+ </span>
+ </li>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="tag_215">
+ <xsl:for-each select="marc:datafield[@tag=215]">
+ <li>
+ <strong>Description&nbsp;: </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>
+ <xsl:if test="marc:subfield[@code='f']"> +
+ <xsl:value-of select="marc:subfield[@code='f']"/>
+ </xsl:if>
+ </li>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="tag_4xx">
+ <xsl:for-each select="marc:datafield[@tag=410]">
+ <li>
+ <strong>Collection&nbsp;: </strong>
+ <span>
+ <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='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='i']"> :
+ <xsl:value-of select="marc:subfield[@code='i']"/>
+ </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>
+ </span>
+ </li>
+ </xsl:for-each>
+<xsl:for-each select="marc:datafield[@tag=411]">
+ <li>
+ <strong>Sous collection&nbsp;: </strong>
+ <span>
+ <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='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='i']"> :
+ <xsl:value-of select="marc:subfield[@code='i']"/>
+ </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>
+ </span>
+ </li>
+ </xsl:for-each>
+ <xsl:for-each select="marc:datafield[@tag=449]">
+ <li>
+ <strong>Etat réglementaire&nbsp;: </strong>
+ <span>
+ <xsl:call-template name="addClassRtl" />
+ <xsl:if test="marc:subfield[@code='a']">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='t']">
+ <xsl:text> : </xsl:text><xsl:value-of select="marc:subfield[@code='t']"/>
+ </xsl:if>
+ </span>
+ </li>
+ </xsl:for-each>
+
+ <xsl:for-each select="marc:datafield[@tag=454]">
+ <li>
+ <strong>Est une traduction de&nbsp;: </strong>
+ <span>
+ <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='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='v']">,
+ <xsl:value-of select="marc:subfield[@code='v']"/>
+ </xsl:if>
+ </span>
+ </li>
+ </xsl:for-each>
+ <xsl:for-each select="marc:datafield[@tag=464 or @tag=461]">
+ <li>
+ <strong>relié avec&nbsp;: </strong>
+ <span>
+ <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='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='v']">,
+ <xsl:value-of select="marc:subfield[@code='v']"/>
+ </xsl:if>
+ </span>
+ </li>
+ </xsl:for-each>
+ <xsl:for-each select="marc:datafield[@tag=462]">
+ <li>
+ <strong>Titre d'ensemble&nbsp;: </strong>
+ <span>
+ <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='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='v']">,
+ <xsl:value-of select="marc:subfield[@code='v']"/>
+ </xsl:if>
+ </span>
+ </li>
+ </xsl:for-each>
+ </xsl:template>
+
+
+ <xsl:template name="tag_4xx_perio">
+ <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: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='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='i']"> :
+ <xsl:value-of select="marc:subfield[@code='i']"/>
+ </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>
+ </span>
+ </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="nl2br">
+  <xsl:param name="string"/>
+  <xsl:value-of select="normalize-space(substring-before($string,'&#10;'))"/>
+  <xsl:choose>
+    <xsl:when test="contains($string,'&#10;')">
+     <br />
+     <xsl:call-template name="nl2br">
+     <xsl:with-param name="string" select="substring-after($string,'&#10;')"/>
+     </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+     <xsl:value-of select="$string"/>
+    </xsl:otherwise>
+  </xsl:choose>
+ </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_5xx">
+ <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:choose>
+ <xsl:when test="marc:subfield[@code=9]">
+ <xsl:attribute name="href">/cgi-bin/koha/catalogue/detail.pl?biblionumber=<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href">/recherche/simple/expressionRecherche/<xsl:value-of select="translate(marc:subfield[@code='a'], '*?()', '+')"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </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_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: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>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href">/recherche/simple/expressionRecherche/<xsl:value-of select="translate(marc:subfield[@code='a'], '*?()', '+')"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <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]">
+ <li>
+ <strong><xsl:value-of select="$label" />: </strong>
+ <xsl:for-each select="marc:datafield[@tag=$tag]">
+ <span>
+ <xsl:call-template name="addClassRtl" />
+ <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>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href">/recherche/simple/expressionRecherche/<xsl:value-of select="marc:subfield[@code='a']"/><xsl:text> </xsl:text><xsl:value-of select="marc:subfield[@code='b']"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <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>
+ </li>
+ </xsl:if>
+ </xsl:template>
+
+<!-- fin du report de utils -->
+
+<xsl:template match="marc:record">
+ <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:if test="marc:datafield[@tag=200]">
+    <xsl:for-each select="marc:datafield[@tag=200]">
+      <h1>
+        <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="$ntitle" />-->
+ <xsl:value-of select="marc:subfield[@code='a'][1]" />
+<xsl:for-each select="marc:subfield[@code='b']">
+ <xsl:text> [</xsl:text><xsl:value-of select="."/><xsl:text>]</xsl:text>
+ </xsl:for-each>
+<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>
+<xsl:if test="marc:subfield[@code='a'][4]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][4]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][5]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][5]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][6]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][6]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][7]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][7]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][8]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][8]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][9]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][9]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='a'][10]"><xsl:text>. </xsl:text><xsl:value-of select="marc:subfield[@code='a'][10]" /></xsl:if>
+
+<!--<xsl:if test="marc:subfield[@code='b']"><xsl:text> [</xsl:text><xsl:value-of select="marc:subfield[@code='b']"/><xsl:text>]</xsl:text>
+ </xsl:if>-->
+
+       <xsl:if test="marc:subfield[@code='f']">
+          <xsl:text> / </xsl:text>
+<xsl:if test="marc:subfield[@code='f'][1]"><xsl:text></xsl:text><xsl:value-of select="marc:subfield[@code='f'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='f'][2]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='f'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='f'][3]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='f'][3]" /></xsl:if>
+        </xsl:if>
+<xsl:if test="marc:subfield[@code='g'][1]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][1]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][2]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][2]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][3]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][3]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][4]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][4]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][5]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][5]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][6]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][6]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][7]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][7]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][8]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][8]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][9]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][9]" /></xsl:if>
+<xsl:if test="marc:subfield[@code='g'][10]"><xsl:text> ; </xsl:text><xsl:value-of select="marc:subfield[@code='g'][10]" /></xsl:if>
+      </h1>
+    </xsl:for-each>
+  </xsl:if>
+ 
+ <li><strong>Numéro de notice Koha : </strong>
+ <xsl:value-of select="$biblionumber"/>
+ </li>
+
+ <xsl:call-template name="tag_099" /> 
+
+ <xsl:call-template name="tag_4xx" />
+
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">421</xsl:with-param>
+ <xsl:with-param name="label">Supplément</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">422</xsl:with-param>
+ <xsl:with-param name="label">Publication-mère du supplément</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">430</xsl:with-param>
+ <xsl:with-param name="label">Suite de</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">432</xsl:with-param>
+ <xsl:with-param name="label">Remplace</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">434</xsl:with-param>
+ <xsl:with-param name="label">Absorbe</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">435</xsl:with-param>
+ <xsl:with-param name="label">Absorbe partiellement</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">436</xsl:with-param>
+ <xsl:with-param name="label">Fusion de ... et de ...</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">437</xsl:with-param>
+ <xsl:with-param name="label">Suite partielle de</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">441</xsl:with-param>
+ <xsl:with-param name="label">Devient partiellement</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">442</xsl:with-param>
+ <xsl:with-param name="label">Remplacé par</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">444</xsl:with-param>
+ <xsl:with-param name="label">Absorbé par</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">446</xsl:with-param>
+ <xsl:with-param name="label">Scindé en ... et en ...</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">447</xsl:with-param>
+ <xsl:with-param name="label">Fusionne avec ... pour former ...</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">453</xsl:with-param>
+ <xsl:with-param name="label">Traduit sous le titre</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">454</xsl:with-param>
+ <xsl:with-param name="label">Est une traduction de</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="tag_4xx_perio">
+ <xsl:with-param name="tag">488</xsl:with-param>
+ <xsl:with-param name="label">Autre type de relation</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_7xx">
+ <xsl:with-param name="tag">700</xsl:with-param>
+ <xsl:with-param name="label">Auteur principal</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_7xx">
+ <xsl:with-param name="tag">710</xsl:with-param>
+ <xsl:with-param name="label">Auteur principal collectivité</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">Co-auteur</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">Auteur secondaire</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">Co-auteur collectivité</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">Auteur secondaire collectivité</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_7xx">
+ <xsl:with-param name="tag">790</xsl:with-param>
+ <xsl:with-param name="label">Emetteurs</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_7xx">
+ <xsl:with-param name="tag">791</xsl:with-param>
+ <xsl:with-param name="label">Emetteurs</xsl:with-param>
+ </xsl:call-template> 
+
+ <xsl:if test="marc:datafield[@tag=022]">
+ <li>
+ <strong>Numéro de publication officielle&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=022]">
+ <xsl:for-each select="marc:subfield">
+ <li>
+ <xsl:value-of select="text()"/>
+ </li>
+ </xsl:for-each>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+ 
+ <xsl:if test="marc:datafield[@tag=029]">
+ <li>
+ <strong>Champs spécifiques BO / Instructions&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=029]">
+ <xsl:for-each select="marc:subfield">
+ <xsl:choose>
+ <xsl:when test="@code='a'">Année : </xsl:when>
+ <xsl:when test="@code='b'">Numéro : </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="text()"/><xsl:text> ; </xsl:text> 
+ </xsl:for-each>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=101]">
+ <li>
+ <strong>Langue&nbsp;: </strong>
+ </li>
+ <xsl:for-each select="marc:datafield[@tag=101]">
+ <xsl:for-each select="marc:subfield">
+ <li>
+ <xsl:choose>
+ <xsl:when test="@code='b'">du texte intermédiaire : </xsl:when>
+ <xsl:when test="@code='c'">de l'oeuvre originale : </xsl:when>
+ <xsl:when test="@code='d'">du résumé : </xsl:when>
+ <xsl:when test="@code='e'">de la table des matières : </xsl:when>
+ <xsl:when test="@code='f'">de la page de titre : </xsl:when>
+ <xsl:when test="@code='g'">du titre propre : </xsl:when>
+ <xsl:when test="@code='h'">du livret : </xsl:when>
+ <xsl:when test="@code='i'">du matériel d'accompagnement : </xsl:when>
+ <xsl:when test="@code='j'">des sous-titres : </xsl:when> </xsl:choose>
+ <xsl:value-of select="text()"/>
+ </li>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:if>
+<!-- test pour bokeh, a supprimer si besoin !!!!!!!-->
+ <xsl:if test="marc:datafield[@tag=1000]">
+ <li>
+ <strong>Langue&nbsp;: </strong>
+ </li>
+ <xsl:for-each select="marc:datafield[@tag=1000]">
+ <li> 
+ <xsl:value-of select="marc:subfield[@code='2']"/> <xsl:text> : </xsl:text><xsl:value-of select="marc:subfield[@code='a']"/>
+ </li>
+ </xsl:for-each>
+ </xsl:if>
+
+
+ <xsl:if test="marc:datafield[@tag=102]">
+ <li>
+ <strong>Pays&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=102]">
+ <xsl:for-each select="marc:subfield">
+ <li>
+ <xsl:value-of select="text()"/>
+ </li>
+ </xsl:for-each>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=205]">
+ <li>
+ <strong>Mention d'édition&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=205]">
+ <xsl:for-each select="marc:subfield">
+ <li>
+ <xsl:value-of select="text()"/>
+ </li>
+ </xsl:for-each>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+
+ <xsl:if test="marc:datafield[@tag=207]">
+ <li>
+ <strong>Ressources continues, numérotation&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=207]">
+ <xsl:for-each select="marc:subfield">
+ <xsl:choose>
+ <xsl:when test="@code='a'">numérotation : </xsl:when>
+ <xsl:when test="@code='z'">source d'information sur la numérotation : </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="text()"/><xsl:text> ; </xsl:text>
+ </xsl:for-each>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:call-template name="tag_210" />
+
+ <xsl:call-template name="tag_215" />
+
+<xsl:if test="marc:controlfield[@tag=009]">
+ <li><strong>Champ 009&nbsp;: </strong>
+ <xsl:value-of select="marc:controlfield[@tag=009]"/>
+ </li>
+ </xsl:if>
+
+ <!-- Build ISBN -->
+ <xsl:if test="marc:datafield[@tag=010]/marc:subfield[@code='a']">
+ <li><strong>ISBN&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=010]/marc:subfield[@code='a']">
+ <li><span property="isbn">
+ <xsl:value-of select="."/>
+ </span></li>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <!-- Build ISSN -->
+ <xsl:if test="marc:datafield[@tag=011]/marc:subfield[@code='a']">
+ <li>
+ <strong>ISSN&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=011]/marc:subfield[@code='a']">
+ <span property="issn">
+ <xsl:value-of select="."/>
+ <xsl:choose>
+ <xsl:when test="position()=last()">
+ <xsl:text>.</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+ </xsl:for-each>
+ </li>
+ </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:call-template name="tag_5xx">
+ <xsl:with-param name="tag">503</xsl:with-param>
+ <xsl:with-param name="label">Titre de forme</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">510</xsl:with-param>
+ <xsl:with-param name="label">Titre parallèle</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">512</xsl:with-param>
+ <xsl:with-param name="label">Titre de couverture</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">513</xsl:with-param>
+ <xsl:with-param name="label">Titre figurant sur une autre page de titre</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">517</xsl:with-param>
+ <xsl:with-param name="label">Autres variantes du titre</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">530</xsl:with-param>
+ <xsl:with-param name="label">Titré clé</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">531</xsl:with-param>
+ <xsl:with-param name="label">Titre abrégé</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">532</xsl:with-param>
+ <xsl:with-param name="label">Titre développé</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_5xx">
+ <xsl:with-param name="tag">540</xsl:with-param>
+ <xsl:with-param name="label">Titre ajouté par le catalogueur</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="marc:datafield[@tag=676]">
+ <li>
+ <strong>Dewey&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=676]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <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='z']">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="marc:subfield[@code='z']"/>
+ </xsl:if>
+ <xsl:if test="not (position()=last())">
+ <xsl:text> ; </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=686]">
+ <li>
+ <strong>Classification&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=686]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <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="not (position()=last())"><xsl:text> ; </xsl:text></xsl:if>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=327]">
+ <li>
+ <strong>Note de contenu&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=327]">
+ <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>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=330]">
+ <li>
+ <strong>Résumé&nbsp;: </strong>
+ </li>
+ <xsl:for-each select="marc:datafield[@tag=330]">
+ <li>
+ <xsl:call-template name="nl2br">
+ <xsl:with-param name="string"><xsl:value-of select="marc:subfield[@code='a']"/></xsl:with-param>
+ </xsl:call-template>
+ </li>
+ </xsl:for-each>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=317]">
+ <li>
+ <strong>Note de provenance&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=317]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=320]">
+ <li>
+ <strong>Bibliographie&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=320]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=328]">
+ <li>
+ <strong>Note de thèse&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=328]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=333]">
+ <li>
+ <strong>Public&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=333]">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:if test="marc:datafield[@tag=955]">
+ <li>
+ <strong>Historique SUDOC du périodique&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=955]">
+ <xsl:value-of select="marc:subfield[@code='9']"/>:
+ <xsl:value-of select="marc:subfield[@code='r']"/>
+ <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
+ </xsl:for-each>
+ </li>
+ </xsl:if>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">600</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Nom de personne</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">601</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Collectivité</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">602</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Famille</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">604</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Auteur/titre</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">606</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Nom commun</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">607</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Nom géographique</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">608</xsl:with-param>
+ <xsl:with-param name="label">Sujet - Forme</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">609</xsl:with-param>
+ <xsl:with-param name="label">Mots clés TESS</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">610</xsl:with-param>
+ <xsl:with-param name="label">Sujet</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">611</xsl:with-param>
+ <xsl:with-param name="label">Mots clés période</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">615</xsl:with-param>
+ <xsl:with-param name="label">Catégorie de sujet</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">616</xsl:with-param>
+ <xsl:with-param name="label">Marque</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="tag_subject">
+ <xsl:with-param name="tag">619</xsl:with-param>
+ <xsl:with-param name="label">Mots clés candidats</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="marc:datafield[@tag=856]">
+ <li>
+ <strong>Ressources en ligne&nbsp;: </strong>
+ <xsl:for-each select="marc:datafield[@tag=856]">
+ <xsl:variable name="SubqText"><xsl:value-of select="marc:subfield[@code='q']"/></xsl:variable>
+ <a target="_blank">
+ <xsl:attribute name="href">
+ <xsl:value-of select="marc:subfield[@code='u']"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="marc:subfield[@code='y' or @code='2' or @code='z']">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">y2z</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(marc:subfield[@code='y']) and not(marc:subfield[@code='3']) and not(marc:subfield[@code='z'])">
+ Cliquez ici pour consulter en ligne </xsl:when>
+ </xsl:choose>
+ </a>
+ <xsl:choose>
+ <xsl:when test="position()=last()"></xsl:when>
+ <xsl:otherwise> | </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </li>
+ </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>
-- 
GitLab