xml - XSLT 合并多个条目并将数字相加

标签 xml xslt

ich 有以下 XML:

<item>
   <number>1</number>
   <value>2</value>
</item>
<item>
   <number>2</number>
   <value>22</value>
</item>
<item>
   <number>1</number>
   <value>4</value>
</item>

我想用 xslt 1.0 将 xml 转换为:

<item>
   <number>1</number>
   <value>6</value>
</item>
<item>
   <number>2</number>
   <value>22</value>
</item>

必须将同一项目编号的值相加,最后我想合并同一项目的元素。可以有 n 个具有相同编号的多个项目。在此示例中,编号为 1 的项目在 xml 中出现了两次,因此这两次将成为一个条目,并且值 (2,4) 将添加到 6。

最佳答案

这是一个非常基本的分组问题。在 XSLT 1.0 中,分组是通过使用 the Muenchian method 完成的。 .

identity transform 开头...

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

将所有 item 分组作者:number通过创建 xsl:key匹配item使用number ...

<xsl:key name="items" match="item" use="number"/>

来自所有 item 的父级上下文的(以doc为例),输出元素的副本并将模板应用于第一个item在组中(以及任何属性)...

<xsl:template match="doc">
  <xsl:copy>
    <xsl:apply-templates select="@*|item[count(.|key('items',number)[1])=1]"/>
  </xsl:copy>
</xsl:template>

添加与 item 匹配的模板并输出它的副本。将模板应用于任何属性和 number元素。然后创建一个新的value元素总和 item与该键匹配...

<xsl:template match="item">
  <xsl:copy>
    <xsl:apply-templates select="@*|number"/>
    <value><xsl:value-of select="sum(key('items',number)/value)"/></value>
  </xsl:copy>
</xsl:template>

完整示例...

XML 输入(添加了单个根元素 doc 以使输入格式正确)

<doc>
    <item>
        <number>1</number>
        <value>2</value>
    </item>
    <item>
        <number>2</number>
        <value>22</value>
    </item>
    <item>
        <number>1</number>
        <value>4</value>
    </item>
</doc>

XSLT 1.0

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

  <xsl:key name="items" match="item" use="number"/>

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

  <xsl:template match="doc">
    <xsl:copy>
      <xsl:apply-templates select="@*|item[count(.|key('items',number)[1])=1]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="item">
    <xsl:copy>
      <xsl:apply-templates select="@*|number"/>
      <value><xsl:value-of select="sum(key('items',number)/value)"/></value>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML 输出

<doc>
   <item>
      <number>1</number>
      <value>6</value>
   </item>
   <item>
      <number>2</number>
      <value>22</value>
   </item>
</doc>

关于xml - XSLT 合并多个条目并将数字相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47721368/

相关文章:

android - 如何在渐变中给出 20 度角?

Html 到 FOP 与 XSLT : css class to attribute-set

xml - 如何转换XML空标签

java - 快速替换 XML 节点值

xslt - 从 XSL 中的字符串中删除非字母数字字符

xml - 使用 AS3 访问包含命名空间的 XML 的第二个 child

java - 为什么我的 XML 解析器只返回一个字符串,而不是多个字符串?

xml - xquery 文件扩展名

java - 为什么在 Tomcat 加载和读取 beans.xml 时没有正确加载 Spring AOP XML 模式

javax Transformer 保留转义实体