复制节点并使用Xslt向属性添加值

 机智的孙志嵘 发布于 2023-02-13 10:48
  • xml
  • Basiccly我有xml和xslt的问题,我不知道如何解决,并希望任何有关此问题的帮助从哪里开始.我有XML:

    
     
       data....
       data....
       data....
     
     
    
    

    现在,我现在需要以这种方式复制"test"节点中的所有节点,并在4个新节点中将值3总是添加到设置值(设置值在测试节点中正在变化),如下所示,所以我会得到:

    
     
       data....
       data....
       data....
       data....
       data....
       data....
       data....
     
     
    
    

    非常感谢你对此事的任何帮助,eoglasi

    1 个回答
    • 正如评论中所提到的,身份转换是您在转换XML时所需要的,并且只想对XML的某些部分进行更改

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

      您说您想"始终将值3添加到设置",因此您将拥有与settings属性匹配的模板.

      <xsl:template match="test/@setting">
      

      (在这种情况下,它只匹配属于测试元素的settings属性.)

      然后在此模板中,您可以使用xsl:attribute输出一个新属性,而不是使用相同的名称但修改值

      <xsl:attribute name="setting">
        <xsl:value-of select="number(.) + 3" />
      </xsl:attribute>
      

      您说您还想在测试节点下复制4个节点.这意味着您需要一个模板来匹配测试节点,因为您需要转换以添加子节点

      <xsl:template match="test">
         <xsl:copy>
           <xsl:apply-templates select="@*" />
           <!-- Add new nodes here -->
           <xsl:apply-templates select="node()"/>
         </xsl:copy>
      </xsl:template>
      

      目前尚不清楚新节点的数据来自哪里,因此您必须自己做,但看起来设置属性来自test元素的setting属性.因此,您的代码可能如下所示:

      <ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>
      

      请注意此处使用属性值模板.花括号{ }表示要计算的表达式而不是字面输出.

      试试这个XSLT作为样本.

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="@*|node()">
          <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
          </xsl:copy>
        </xsl:template>
      
        <xsl:template match="test/@setting">
          <xsl:attribute name="setting">
            <xsl:value-of select="number(.) + 3" />
          </xsl:attribute>
        </xsl:template>
      
        <xsl:template match="test">
          <xsl:copy>
            <xsl:apply-templates select="@*" />
            <ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>
            <xsl:apply-templates select="node()"/>
          </xsl:copy>
        </xsl:template>
      </xsl:stylesheet>
      

      2023-02-13 10:50 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有