如何创建结果字符串“代码” +“ 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>
答案 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)
。