xslt-v1:邻居定义的元素值之和

时间:2018-11-05 13:29:22

标签: xml xslt xslt-1.0

如何创建结果字符串“代码” +“ Sum_of_Value_for_adjacent_Items_with_equal_Code” -...?换句话说,对于下面的xml,reslut应该是A3-B7-A2-C13-A4。 xsl v1是否可以实现?

<?xml version="1.0" encoding="UTF-8"?>

<MyXML>
<Item id = "1">
     <Code>A</Code> 
     <Value>2</Value> 
</Item>
<Item id = "2">
     <Code>A</Code> 
     <Value>1</Value> 
</Item>
<Item id = "3">
     <Code>B</Code> 
     <Value>7</Value> 
</Item>
<Item id = "4">
     <Code>A</Code> 
     <Value>2</Value> 
</Item>
<Item id = "5">
     <Code>C</Code> 
     <Value>8</Value> 
</Item>
<Item id = "6">
     <Code>C</Code> 
     <Value>3</Value> 
</Item> 
<Item id = "7">
     <Code>C</Code> 
     <Value>2</Value> 
</Item>     
<Item id = "8">
     <Code>A</Code> 
     <Value>4</Value> 
</Item>     
</MyXML>

1 个答案:

答案 0 :(得分:0)

用于此目的的一种XSLT 1方法称为同级递归,其中您先处理第一个Item,然后递归处理下一个following-sibling::Item[1]

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
      <xsl:apply-templates select="*/Item[1]"/>
  </xsl:template>

  <xsl:template match="Item">
      <xsl:param name="sum" select="0"/>
      <xsl:variable name="next" select="following-sibling::Item[1]"/>
      <xsl:choose>
          <xsl:when test="$next/Code = Code">
              <xsl:apply-templates select="$next">
                  <xsl:with-param name="sum" select="$sum + Value"/>
              </xsl:apply-templates>
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="concat(Code, $sum + Value, '-')"/>
              <xsl:apply-templates select="$next"/>
          </xsl:otherwise>
      </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bdxtr6

这通常显示了这种方法,为了避免在最后一个值之后出现-,您需要插入额外的检查或将结果存储在变量中并提取substring($var, 1, string-length($var) - 1)