xslt按元素组总结

时间:2013-05-13 13:12:02

标签: xslt xslt-1.0

我要求在TXLifeRequest下添加额外的部分,以便从以下xml中总结付款金额。

<?xml version="1.0" encoding="utf-8"?>
<TXLife xmlns="http://ACORD.org/Standards/Life/2">
    <TXLifeRequest>
        <FundCode>LTRT00</FundCode>
        <AccountDescription>CWA xxx</AccountDescription>
        <CurrencyTypeCode>840</CurrencyTypeCode>
        <TransExeDate>2013-04-20</TransExeDate>
        <AccountNumber>34142</AccountNumber>
        <PaymentAmt>300.000000000</PaymentAmt>
        <ReversalInd>0</ReversalInd>
    </TXLifeRequest>
    <TXLifeRequest>
        <FundCode>LTRW00</FundCode>
        <AccountDescription>CWA xxx</AccountDescription>
        <CurrencyTypeCode>840</CurrencyTypeCode>
        <TransExeDate>2013-04-20</TransExeDate>
        <AccountNumber>34142</AccountNumber>
        <PaymentAmt>300.000000000</PaymentAmt>
        <ReversalInd>0</ReversalInd>
    </TXLifeRequest>
    <TXLifeRequest>
        <FundCode>LTRW00</FundCode>
        <AccountDescription>CWA xxx</AccountDescription>
        <CurrencyTypeCode>840</CurrencyTypeCode>
        <TransExeDate>2013-04-20</TransExeDate>
        <AccountNumber>34142</AccountNumber>
        <PaymentAmt>300.000000000</PaymentAmt>
        <ReversalInd>0</ReversalInd>
    </TXLifeRequest>
    <TXLifeRequest>
        <FundCode>LUL500</FundCode>
        <AccountDescription>CWA xxx</AccountDescription>
        <CurrencyTypeCode>840</CurrencyTypeCode>
        <TransExeDate>2013-04-20</TransExeDate>
        <AccountNumber>34142</AccountNumber>
        <PaymentAmt>800.000000000</PaymentAmt>
        <ReversalInd>1</ReversalInd>
    </TXLifeRequest>
</TXLife>

总结PaymentAmt的标准是查找组合TransExeDate , AccountNumber and ReversalInd。因此,当我应用我的以下xslt PaymentAmt

时,基于这些标准
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" xmlns:ns="http://ACORD.org/Standards/Life/2">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:key name="detKey7s" match="//ns:TXLifeRequest"
        use="concat(generate-id(..), ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd)"/>

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

    <xsl:template match="/ns:TXLife">
        <xsl:element name="TXLife" namespace="http://ACORD.org/Standards/Life/2">
        <xsl:for-each select="ns:TXLifeRequest[generate-id() = generate-id(key('detKey7s',
            concat(generate-id(..), ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd)
            )
            )
            ]
            ">
            <xsl:copy>

                <xsl:variable name="vDataGroup" select=
                    "key('detKey7s', concat(generate-id(..),ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd))"/>                
                <xsl:apply-templates select="./*"></xsl:apply-templates>               
                <xsl:element name="TotalAmount" namespace="http://ACORD.org/Standards/Life/2">
                    <xsl:value-of select="sum($vDataGroup/ns:PaymentAmt)"/>
                </xsl:element>

            </xsl:copy>  

        </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

因此,在应用上面的xslt之后,我将得到总结TXLifeRequest xml,请参阅<TotalAmount>600</TotalAmount>

<TXLife xmlns="http://ACORD.org/Standards/Life/2">
   <TXLifeRequest>
      <FundCode>LTRT00</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>300.000000000</PaymentAmt>
      <ReversalInd>0</ReversalInd>
      <TotalAmount>300</TotalAmount>
   </TXLifeRequest>
   <TXLifeRequest>
      <FundCode>LTRW00</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>300.000000000</PaymentAmt>
      <ReversalInd>0</ReversalInd>
      <TotalAmount>600</TotalAmount>
   </TXLifeRequest>
   <TXLifeRequest>
      <FundCode>LUL500</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>800.000000000</PaymentAmt>
      <ReversalInd>1</ReversalInd>
      <TotalAmount>800</TotalAmount>
   </TXLifeRequest>
</TXLife>

现在的问题是如何在总结部分添加额外的部分?所以最后xml看起来应如下所述

<TXLifeRequest>
      <FundCode>LTRT00</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>300.000000000</PaymentAmt>
      <ReversalInd>0</ReversalInd>
      <TotalAmount>300</TotalAmount>
   </TXLifeRequest>
   <TXLifeRequest>
      <FundCode>LTRW00</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>300.000000000</PaymentAmt>
      <ReversalInd>0</ReversalInd>
      <TotalAmount>600</TotalAmount>
   </TXLifeRequest>

   <TXLifeRequest>
      <SummedUP>LTRW00</SummedUP>
   </TXLifeRequest>


   <TXLifeRequest>
      <FundCode>LUL500</FundCode>
      <AccountDescription>CWA – NB+U</AccountDescription>
      <CurrencyTypeCode>840</CurrencyTypeCode>
      <TransExeDate>2013-04-20</TransExeDate>
      <AccountNumber>34142</AccountNumber>
      <PaymentAmt>800.000000000</PaymentAmt>
      <ReversalInd>1</ReversalInd>
      <TotalAmount>800</TotalAmount>
   </TXLifeRequest>

在上面提到的总结部分之后添加一个部分,我很震惊。请让我知道如何继续。任何想法??

谢谢, Madhu CM

1 个答案:

答案 0 :(得分:1)

这只是对当前xsl:stylesheet的一个小改动:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"
    xmlns="http://ACORD.org/Standards/Life/2">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:key name="detKey7s" match="//ns:TXLifeRequest"
        use="concat(generate-id(..), ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd)"/>

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

    <xsl:template match="/ns:TXLife">
        <xsl:element name="TXLife" namespace="http://ACORD.org/Standards/Life/2">
            <xsl:for-each select="ns:TXLifeRequest[generate-id() = generate-id(key('detKey7s',
            concat(generate-id(..), ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd)
            )
            )
            ]
            ">
                <xsl:variable name="vDataGroup" select=
                    "key('detKey7s', concat(generate-id(..),ns:TransExeDate, '+', ns:FundCode, '+', ns:ReversalInd))"/>

                <xsl:copy>

                    <xsl:apply-templates select="./*"></xsl:apply-templates>
                    <xsl:element name="TotalAmount" namespace="http://ACORD.org/Standards/Life/2">
                        <xsl:value-of select="sum($vDataGroup/ns:PaymentAmt)"/>
                    </xsl:element>

                </xsl:copy>
                <xsl:if test="count($vDataGroup) >1" >
                    <TXLifeRequest>
                        <SummedUP>
                            <xsl:value-of select=" ns:FundCode"/>
                        </SummedUP>
                    </TXLifeRequest>
                </xsl:if>

            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

将生成以下输出:

<TXLife xmlns="http://ACORD.org/Standards/Life/2">
  <TXLifeRequest>
    <FundCode>LTRT00</FundCode>
    <AccountDescription>CWA xxx</AccountDescription>
    <CurrencyTypeCode>840</CurrencyTypeCode>
    <TransExeDate>2013-04-20</TransExeDate>
    <AccountNumber>34142</AccountNumber>
    <PaymentAmt>300.000000000</PaymentAmt>
    <ReversalInd>0</ReversalInd>
    <TotalAmount>300</TotalAmount>
  </TXLifeRequest>
  <TXLifeRequest>
    <FundCode>LTRW00</FundCode>
    <AccountDescription>CWA xxx</AccountDescription>
    <CurrencyTypeCode>840</CurrencyTypeCode>
    <TransExeDate>2013-04-20</TransExeDate>
    <AccountNumber>34142</AccountNumber>
    <PaymentAmt>300.000000000</PaymentAmt>
    <ReversalInd>0</ReversalInd>
    <TotalAmount>600</TotalAmount>
  </TXLifeRequest>
  <TXLifeRequest>
    <SummedUP>LTRW00</SummedUP>
  </TXLifeRequest>
  <TXLifeRequest>
    <FundCode>LUL500</FundCode>
    <AccountDescription>CWA xxx</AccountDescription>
    <CurrencyTypeCode>840</CurrencyTypeCode>
    <TransExeDate>2013-04-20</TransExeDate>
    <AccountNumber>34142</AccountNumber>
    <PaymentAmt>800.000000000</PaymentAmt>
    <ReversalInd>1</ReversalInd>
    <TotalAmount>800</TotalAmount>
  </TXLifeRequest>
</TXLife>