XML到HTML(XSLT):复制节点以替换某些行并添加新行 [英] XML to HTML (XSLT): copy a node replacing some lines and adding new ones

查看:106
本文介绍了XML到HTML(XSLT):复制节点以替换某些行并添加新行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须将一个<script>节点从xml复制到html,但是我需要动态替换它的某些行,并添加新行.因此,我需要在复制整个节点的同时搜索并替换字符串.

I must copy a <script> node from xml to html, but I need to replace dinamically some lines of it, and also add new ones. So I need to search-and-replace strings while the entire node is copying.

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. 我该怎么办?

If it's much easy, I can use XTLS 2.0. How can I do?

推荐答案

此转换:

<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>

产生想要的结果(执行所有命令并编辑脚本):

produces the wanted result (all commands carried out and the script edited):

<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>

这篇关于XML到HTML(XSLT):复制节点以替换某些行并添加新行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆