XML в HTML (XSLT): скопировать узел, заменив некоторые строки и добавив новые - PullRequest
0 голосов
/ 31 октября 2011

Я должен скопировать <script> узел из xml в html, но мне нужно динамически заменить некоторые его строки, а также добавить новые.Поэтому мне нужно искать и заменять строки во время копирования всего узла.

Пример 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 a = 2;
      var b = "abc";
      var c = new Array(0,0,0);
      alert("Input!");
   ]]></script>

   <!-- here svg drawing tags -->

</svg>

Пример вывода HTML:

<html>
   <head>
      <title>Example!</title>

      <script type="application/javascript">
          var a = 2;                          <!---same as xml--->
          var b = "def";                      <!---modified--->
          var c = new Array(0,0,0);           <!---same as xml---> 
          alert("This is a new example!");    <!---modified---> 
          var new = "new var";                <!---new code--->             
      </script>
   </head> 
   <body>
   </body>
</html>

Если этонамного проще, я могу использовать XTLS 2.0.Как я могу это сделать?

1 Ответ

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

Это преобразование :

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:svg="http://www.w3.org/2000/svg"
        xmlns:my="my:my">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>

        <xsl:param name="pSrcEdits">
         <line num="2" act="del"/>
         <line num="4" act="rep"
               newLine="var c = new Array(1,1,1);"/>
         <line num="5" act="ins"
               newLine="/* Inserted comment */"/>
        </xsl:param>

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

 <xsl:template match="svg:script/text()">
  <xsl:variable name="vLines" select="tokenize(., '&#xD;?&#xA;')"/>

  <xsl:sequence select="my:editLines($vLines, $pSrcEdits/*)"/>
 </xsl:template>

 <xsl:function name="my:editLines" as="xs:string*">
  <xsl:param name="pLines" as="xs:string*"/>
  <xsl:param name="pCommands" as="element()*"/>

  <xsl:for-each select="$pLines">
   <xsl:variable name="vLineNum" as="xs:integer"
    select="position()"/>
   <xsl:variable name="vCommand"
     select="$pCommands[number(@num) eq  $vLineNum]"/>
   <xsl:sequence select="my:editSingle(., $vCommand)"/>
  </xsl:for-each>
 </xsl:function>

 <xsl:function name="my:editSingle" as="xs:string?">
  <xsl:param name="pLine" as="xs:string"/>
  <xsl:param name="pCommand" as="element()?"/>

  <xsl:sequence select=
  "if(not($pCommand))
     then concat($pLine, '&#xA;')
     else
      if($pCommand/@act eq 'del')
         then ()
         else
          if($pCommand/@act eq 'rep')
            then concat($pCommand/@newLine, '&#xA;')
            else (: 'ins' :)
              concat($pCommand/@newLine, '&#xA;', $pLine, '&#xA;')
  "/>

 </xsl:function>
</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 a = 2;
      var b = "abc";
      var c = new Array(0,0,0);
      alert("Input!");
   ]]></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 type="application/javascript">
       var b = "abc";
 var c = new Array(1,1,1);
 /* Inserted comment */
      alert("Input!");

</script>

   <!-- here svg drawing tags -->

</svg>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...