XSLT: Как скопировать код Javascript из XML в HTML, изменив некоторые его строки - PullRequest
3 голосов
/ 29 октября 2011

Мне нужно преобразовать файл SVG в холст HTML5 через XSLT. Проблема в Javascript. В файле SVG у меня есть тег сценария с некоторым кодом, как в этом простом примере:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
id="slot" width="320" height="245">

   <script type="application/javascript"><![CDATA[
        var test = 2;
        alert("This is a test!");
   ]]></script>

   <----here svg drawing tags--->

</svg>

Я хочу вывести в HTML код Javascript, модифицированный в некоторых частях, и добавить новый код, например:

<html>
   <head>
   <title> SVG to HTML5!</title>

   <script type="application/javascript">
      var new_test;                 <---the new code--->

      var test = 4;                 <---this is the modified code from 
      alert("This is a new test!");                 svg file--->
   </script>
   </head> 
   <body>
  </body>
</html>

Как я могу это сделать?

1 Ответ

1 голос
/ 29 октября 2011

Хотя можно написать (несколько сложный) код, который будет выполнять отдельные замены / вставки / удаления строк, гораздо более простой подход - заменить полный элемент script:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:svg="http://www.w3.org/2000/svg"
 xmlns="http://www.w3.org/2000/svg">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNewScript">
     <script type="application/javascript">
      var new_test;                

      var test = 4;                
      alert("This is a new test!");                 
   </script>
 </xsl:param>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="svg:script">
  <xsl:copy-of select="$pNewScript"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу (исправлено в правильном формате):

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
id="slot" width="320" height="245">

   <script type="application/javascript"><![CDATA[
        var test = 2;
        alert("This is a test!");
   ]]></script>

   <!-- here svg drawing tags -->

</svg>

желаемый, правильный результат получается :

 <svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="slot" width="320" height="245">
   <script xmlns:svg="http://www.w3.org/2000/svg" type="application/javascript">
      var new_test;                

      var test = 4;                
      alert("This is a new test!");                 
   </script><!-- here svg drawing tags -->
</svg>
...