如何使用xslt生成和求和不同复杂元素的两个不同节点的值?

时间:2016-04-23 18:46:47

标签: xml xslt xslt-1.0

我的XML是

<root> <source> <item> <id>111</id> <qty>2</qty> </item> <item> <id>222</id> <qty>1</qty> </item> <item> <id>333</id> <qty>4</qty> </item> </source> <target> <record> <id>111</id> <price>1000</price> </record> <record> <id>333</id> <price>500</price> </record> </target> </root>

现在我需要匹配source / item和target / record的id元素,如果匹配我需要产生

  

来源/项目/数量*目标/记录/价格

一旦产品完成所有匹配的情况,我应该总结所有产品价值,并应得到结果

  

4000即(所有匹配元素的总和(数量*价格)。)

如何实现这一点,请提前帮助我

2 个答案:

答案 0 :(得分:0)

在XSLT 2.0中,您可以执行以下操作:

<xsl:key name="target" match="record" use="id" />

<xsl:template match="/root">
    <result>
        <xsl:value-of select="sum(source/item[key('target', id)]/(qty * key('target', id)/price))"/>
    </result>
</xsl:template>

答案 1 :(得分:0)

我已从Dimitre Novatchev修改此answer以满足您的要求。代码如下:

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

    <xsl:key name="target" match="record" use="id" />

    <xsl:template match="/">
        <xsl:call-template name="sumProducts">
            <!-- get only sources with respective equivalent targets -->
            <xsl:with-param name="pList" select="*/*/item[key('target', id)]"/>
            <!-- a list of target records -->
            <xsl:with-param name="pList2" select="*/*/record"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="sumProducts">
        <xsl:param name="pList"/>
        <xsl:param name="pList2"/>
        <xsl:param name="pAccum" select="0"/>

        <xsl:choose>
            <xsl:when test="$pList">
                <xsl:variable name="vHead" select="$pList[1]"/>
                <xsl:variable name="vHead2" select="$pList2"/>

                <xsl:call-template name="sumProducts">
                    <xsl:with-param name="pList" select="$pList[position() > 1]"/>
                    <xsl:with-param name="pList2" select="$pList2"/>
                    <xsl:with-param name="pAccum"
                        select="$pAccum + $vHead/qty * $vHead2[id = $vHead/id]/price"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$pAccum"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>