diff --git a/VERSIONS_HOTLINE/108997 b/VERSIONS_HOTLINE/108997
new file mode 100644
index 0000000000000000000000000000000000000000..9553a8e553211aa44e5acb350ab9ffaaafe9eb51
--- /dev/null
+++ b/VERSIONS_HOTLINE/108997
@@ -0,0 +1 @@
+ - ticket #108997 : OPAC : Des Entités HTML apparaissent dans les notices en provenance de sources externes avec un affichage via feuille de style XSLT
\ No newline at end of file
diff --git a/library/Class/Notice/Xsl.php b/library/Class/Notice/Xsl.php
index 836b13ba3118601d3508fa2abaf95ab066959ba3..9f6e9d9c3210f9235d7761ee074c9c83ce96ab1e 100644
--- a/library/Class/Notice/Xsl.php
+++ b/library/Class/Notice/Xsl.php
@@ -93,7 +93,7 @@ class Class_Notice_Xsl {
 
   public function filePutMarcToXML($marc) {
     return ($marc_xml_array = static::getYaz()->marcToMarcXml($marc))
-      ? static::getYaz()->writeMarcXmlInFile(implode("\n", $marc_xml_array))
+      ? static::getYaz()->writeMarcXmlInFile(implode("\n",$marc_xml_array))
       : '';
   }
 
diff --git a/library/Class/Testing/Yaz.php b/library/Class/Testing/Yaz.php
index f523ec1eab38a613e539a703c04a77cbb728883f..63b209a608b035f4b9b567fa59c396d18d859f94 100644
--- a/library/Class/Testing/Yaz.php
+++ b/library/Class/Testing/Yaz.php
@@ -35,7 +35,18 @@ class Class_Testing_Yaz {
 
     static::getFileSystem()->unlink($filename);
 
-    return $cmd->getOutput();
+    return $this->_sanitizeXmlData($cmd->getOutput());
+  }
+
+
+  protected function _sanitizeXmlData($marc_xml_array){
+    return array_map(function($line)
+                     {
+                       return str_replace(['&','& '],
+                                          ['&','& '],
+                                          $line );
+                     },
+                     $marc_xml_array);
   }
 
 
diff --git a/tests/scenarios/Xsl/XslTest.php b/tests/scenarios/Xsl/XslTest.php
index a33d7e2cee3e8ac5d33e6a80a8de913eda5344f3..dd44802ba575de1786b317ab6d99480d61970188 100644
--- a/tests/scenarios/Xsl/XslTest.php
+++ b/tests/scenarios/Xsl/XslTest.php
@@ -59,6 +59,13 @@ class XslRechercheControllerViewnoticeWithInspectorGadgetAndMarcXMLEnabledTest e
     $this->dispatch('/opac/recherche/viewnotice/id/2/inspector_gadget/1', true);
   }
 
+  public function tearDown(){
+    Class_Testing_Yaz::setCommand(null);
+    Class_Testing_Yaz::setFileSystem(null);
+
+    parent::tearDown();
+  }
+
 
   /** @test */
   public function tabMarcXMLShouldBePresent() {
@@ -106,6 +113,14 @@ class XslRechercheControllerViewnoticeAndMarcXMLWithLineBreaksTest extends Model
 
     $this->assertEquals($marcxml_output, explode("\n", $this->_written_content));
   }
+
+
+  public function tearDown(){
+    $xsl = new Class_Notice_Xsl(new Class_Notice(), new Class_Profil());
+    $xsl->setYaz(null);
+
+    parent::tearDown();
+  }
 }
 
 
@@ -307,6 +322,11 @@ class XslNoticeajaxDetailDispatchWithoutXSLTest extends AbstractControllerTestCa
     $this->dispatch('/opac/noticeajax/detail/id_notice/5', true);
   }
 
+  public function tearDown(){
+    Class_Notice_Xsl::setPhpCommand(null);
+    parent::tearDown();
+  }
+
 
   /** @test */
   public function plzInstallXSLErrorShouldBeDisplay() {
@@ -350,6 +370,10 @@ class XslFileManagerControllerWithXslInRechercheViewnoticeTest extends Admin_Abs
   }
 
 
+  public function tearDown(){
+    Class_FileManager::setFileSystem(null);
+    parent::tearDown();
+  }
 
   /** @test */
   public function dispatchDeleteShouldDisplayDisabledDeleteButton() {
@@ -520,6 +544,11 @@ class XslSearchResultDispatchTest extends AbstractControllerTestCase {
 
   public function tearDown() {
     Storm_Cache::setDefaultZendCache(null);
+    Class_Notice_Xsl::setPhpCommand(null);
+    Class_Notice_Xsl::setDomDocument(null);
+    Class_Notice_Xsl::setXSLTProcessor(null);
+    Class_FileManager::setFileSystem(null);
+
     parent::tearDown();
   }
 
@@ -538,6 +567,32 @@ class XslSearchResultDispatchTest extends AbstractControllerTestCase {
 
 
 
+class XslMarcToXmlTest extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+  protected $_output;
+
+  public function setUp() {
+    parent::setUp();
+
+    $notice_unimarc = "02517nm40 22004331i 450 001000700000100004100007101000800048200002200056210000900078215001100087317000500098330072600103610001200829610002200841610001300863701002400876701002200900701002800922701002300950701002000973701002500993701002501018701002701043701002901070701002501099701002801124701002901152701002101181856005901202856009301261856009301354856009401447856009401541856009201635856009201727856009201819856009201911856008002003506625  a20200328a|||||||||||y0frey0103####ba0 afre1 aUn singe en hiver  d20201 a105 mn  a  aEn juin 1944, Albert Quentin, ancien fusilier marin en Indochine, est propriétaire d'un hôtel dans un village normand. Un beau jour où, une fois de plus, il a un peu trop bu, il prend brutalement conscience qu'il n'est plus sur le pont de son navire, quelque part dans la mer de Chine, mais dans son établissement, sous un intense bombardement allié. Il fait le serment de ne plus boire s'il en réchappe. Promesse tenue depuis lors, au grand plaisir de madame Quentin. Un soir d'hiver, le jeune Gabriel Fouquet arrive à l'hôtel et se met à boire pour oublier son mariage malheureux. Albert se prend d'affection pour son hôte et finit par partager avec lui une monumentale beuverie...1 aCinéma1 aCulte & Classique1 aComédie1 aVerneuil Henri43001 aFlon Suzanne40051 aBelmondo Jean-Paul40051 aFrankeur Paul40051 aGabin Jean40051 aArnold Marcelle40051 aRoquevert Noël40051 aDorziat Gabrielle40051 aDieudonné Hélène40051 aDalibert André40051 aMargollé Sylviane40051 aCoffinet Anne-Marie40051 aPetri Hella4005  ahttp://bdp10.afi-sa.net/bib-numerique/notice/ido/156821 xposterahttps://medias.mednum.lab.arte.tv/59/d6/59d65c75-129a-11ea-ba43-3783b3d44f36.jpg1 xposterahttps://medias.mednum.lab.arte.tv/59/d6/59d65c75-129a-11ea-ba43-3783b3d44f36.jpg1 xtrailerahttps://medias.mednum.lab.arte.tv/51/d1/51d1de0f-3bd8-4057-a3c5-5143b512b645.mp41 xtrailerahttps://medias.mednum.lab.arte.tv/51/d1/51d1de0f-3bd8-4057-a3c5-5143b512b645.mp41 xphotoahttps://medias.mednum.lab.arte.tv/63/40/6340654a-129a-11ea-ba05-215aa6b24520.jpg1 xphotoahttps://medias.mednum.lab.arte.tv/66/fa/66fa5cca-129a-11ea-a60c-e94b466690d8.jpg1 xphotoahttps://medias.mednum.lab.arte.tv/5f/4b/5f4bb9f5-129a-11ea-99a7-11eda40fb68f.jpg1 xphotoahttps://medias.mednum.lab.arte.tv/ad/76/ad763020-cd01-49a3-913d-9395add44648.jpg1 xexternal_uriahttps://vod.mediatheque-numerique.com/films/un-singe-en-hiver";
+
+    $this->_output = (new Class_Testing_Yaz())->marcToMarcXml($notice_unimarc);
+  }
+
+
+  /** @test */
+  public function marcxmlTransformedshouldDisplayMarcWithHTMLEntities() {
+    $this->assertContains(''', implode("\n",$this->_output));
+  }
+
+
+  /** @test */
+  public function marcXmlTransformshouldContainsCulteAndClassique() {
+    $this->assertContains('Culte & Classique', implode("\n",$this->_output));
+  }
+}
+
+
 
 class XslSearchResultDispatchWithEmptyTransformTest extends AbstractControllerTestCase {
   protected $_storm_default_to_volatile = true;