基于属性值对XSLT元素进行分组

时间:2015-02-18 14:38:48

标签: xslt xslt-1.0

我要求唯一地转换学生记录。

示例IP:

<Root>
<A>
    <B>
        <C>
            <qty>1</qty>
            <item id="1"></stud>
        </C>
        <C>
            <qty>2</qty>
            <item id="1"></stud>
        </C>
    </B>
</A>

需要的O / P:

<Root>
<A>
    <B>
        <C>
            <qty>3</qty>
            <item id="1"></stud>
        </C>
    </B>
</A>

如何在xslt 1.0中执行此操作?我试过Muenchian分组!但失败了。请指导我!

1 个答案:

答案 0 :(得分:0)

定义一个键<xsl:key name="c-by-id" match"B/C" use="item/@id"/>,然后用它来禁止复制与

重复的项目
<xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>

并用

计算总和
<xsl:template match="B/C/qty">
    <xsl:copy>
        <xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
    </xsl:copy>
</xsl:template>

与身份转换模板一起使用完整的样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


    <xsl:key name="c-by-id" match="B/C" use="item/@id"/>

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

    <xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>

    <xsl:template match="B/C/qty">
        <xsl:copy>
            <xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

在线http://xsltransform.net/nc4NzQs