2013-05-13 75 views
1

我有要求在TXLifeRequest下增加一个额外部分,以便从下面的xml中总结付款金额。xslt根据元素组合总结

<?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因此应用上面的XSLT我会总结TXLifeRequest XML看到<TotalAmount>600</TotalAmount>后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> 

<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> 

我感到惊讶的是在上面提到的总结部分之后添加一个部分。请让我知道我如何继续。有任何想法吗 ??

感谢, 马杜CM

回答

1

这仅仅是一个SMaL公司变更现有的xsl:样式:

<?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>