XSLT Distinct值和值的SUM

时间:2015-04-21 16:20:35

标签: xml xslt xslt-2.0

我有以下XML

<cost-detail>
  <costcards>
    <costcard>
      <cost-code code="C-Copy">
        <name>Reproduction Cost</name>
      </cost-code>
      <card-values>
        <card-value type="billed">
          <amount>0.05</amount>
        </card-value>
      </card-values>
    </costcard>
    <costcard>
      <cost-code code="C-Copy">
        <name>Reproduction Cost</name>
      </cost-code>
      <card-values>
        <card-value type="billed">
          <amount>0.05</amount>
        </card-value>
      </card-values>
    </costcard>
    <costcard>
      <cost-code code="D-Court">
        <name>Court Filing Fees</name>
      </cost-code>
      <card-values>
        <card-value type="billed">
          <amount>1027.50</amount>
        </card-value>
      </card-values>
    </costcard>
    <costcard>
      <cost-code code="D-Court">
        <name>Court Filing Fees</name>
      </cost-code>
      <card-values>
        <card-value type="billed">
          <amount>27.50</amount>
        </card-value>
      </card-values>
    </costcard>
  </costcards>
</cost-detail>

我有以下XSLT表:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:aml="http://schemas.microsoft.com/aml/2001/core" 
                xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 
                xmlns:fo="http://www.w3.org/1999/XSL/Format" 
                xmlns:tlr="http://www.elite.com/functions" 
                xmlns:o="urn:schemas-microsoft-com:office:office" 
                xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" 
                xmlns:st1="urn:schemas-microsoft-com:office:smarttags" 
                xmlns:v="urn:schemas-microsoft-com:vml" 
                xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" 
                xmlns:w10="urn:schemas-microsoft-com:office:word" 
                xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" 
                xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template name="Prof_DisbSummary">
    <xsl:variable name="TW" select="1440"/>
    <w:tbl>
      <xsl:variable name="Col1" select="2.50 * $TW"/>
      <xsl:variable name="Col2" select="1 * $TW"/>
      <w:tblPr>
        <w:jc w:val="center"/>
        <w:tblBorders>
          <w:top w:val="single" w:sz="1"/>
          <w:left w:val="single" w:sz="1"/>
          <w:bottom w:val="single" w:sz="1"/>
          <w:right w:val="single" w:sz="1"/>
        </w:tblBorders>
        <w:tblW w:w="0" w:type="dxa"/>
        <w:tblLayout w:type="Fixed"/>
        <w:tblCellMar>
          <w:left w:w="0" w:type="dxa"/>
          <w:right w:w="0" w:type="dxa"/>
        </w:tblCellMar>
      </w:tblPr>
      <w:tblGrid>
        <w:gridCol w:w="{$Col1}"/>
        <w:gridCol w:w="{$Col2}"/>
        <w:gridCol w:w="{$Col3}"/>
      </w:tblGrid>
      <w:tr>
        <!-- Cost Code Header  -->
        <w:tc>
          <tcPr>
            <w:tcW w:w="{$Col1}" w:type="dxa"/>
            <w:shd w:val="solid" w:fill="auto" w:color="000080"/>
          </tcPr>
          <w:p>
            <w:r>
              <w:rPr>
                <w:b/>
                <w:color w:val="FFFFFF"/>
              </w:rPr>
              <w:t>&#xA0;Cost Code</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <!-- Cost Code Header  -->
        <w:tc>
          <tcPr>
            <w:tcW w:w="{$Col2}" w:type="dxa"/>
            <w:shd w:val="solid" w:fill="auto" w:color="000080"/>
          </tcPr>
          <w:p>
            <w:pPr>
              <w:jc w:val="right"/>
            </w:pPr>
            <w:r>
              <w:rPr>
                <w:b/>
                <w:color w:val="FFFFFF"/>
              </w:rPr>
              <w:t>Amount&#xA0;</w:t>
            </w:r>
          </w:p>
        </w:tc>
      </w:tr>
      <xsl:for-each select="//superbill/invoice/matters/matter/cost-detail/costcards/costcard">
        <w:tr>
          <!-- Cost Code Data  -->
          <w:tc>
            <tcPr>
              <w:tcW w:w="{$Col1}" w:type="dxa"/>
            </tcPr>
            <w:p>
              <w:r>
                <w:t>&#xA0;<xsl:value-of select="summarize-to/code"/> - <xsl:value-of select="summarize-to/name"/></w:t>
              </w:r>
            </w:p>
          </w:tc>
          <!-- Amount Data  -->
          <w:tc>
            <tcPr>
              <w:tcW w:w="{$Col2}" w:type="dxa"/>
            </tcPr>
            <w:p>
              <w:pPr>
                <w:jc w:val="right"/>
              </w:pPr>
              <w:r>
                <w:t><xsl:value-of select="card-values/card-value[@type='billed']/amount"/>&#xA0;</w:t>
              </w:r>
            </w:p>
          </w:tc>
        </w:tr>
      </xsl:for-each>
      <!-- Totals Rows -->
      <w:tr>
        <!-- Cost Code Total  -->
        <w:tc>
          <tcPr>
            <w:tcW w:w="{$Col1}" w:type="dxa"/>
            <w:tcBorders>
              <w:top w:val="single" w:sz="1"/>
            </w:tcBorders>
          </tcPr>
          <w:p>
            <w:r>
              <w:rPr>
                <w:b/>
              </w:rPr>
              <w:t>&#xA0;Total Disbursements:</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <!-- Amount Date  -->
        <w:tc>
          <tcPr>
            <w:tcW w:w="{$Col2}" w:type="dxa"/>
            <w:tcBorders>
              <w:top w:val="single" w:sz="1"/>
            </w:tcBorders>
          </tcPr>
          <w:p>
            <w:pPr>
              <w:jc w:val="right"/>
            </w:pPr>
            <w:r>
              <w:rPr>
                <w:b/>
              </w:rPr>
              <w:t><xsl:value-of select="//superbill/invoice/matters/matter/billing-summary/totals-summary/total[@type='disbursements']"/>&#xA0;</w:t>
            </w:r>
          </w:p>
        </w:tc>
      </w:tr>
    </w:tbl>
  </xsl:template>
</xsl:stylesheet>

显示......

enter image description here

我希望能够做的是,每条DISTINCT“成本代码”(C-Copy&amp; D-Court)显示每行的金额的SUM,而不是每个单一的成本代码及其金额。看起来像:

enter image description here

这一切都可能吗?

提前谢谢你。

1 个答案:

答案 0 :(得分:2)

这看起来像是一个非常简单的分组问题。

xsl:for-each更改为xsl:for-each-group,并指定group-by="cost-code/@code"。在xsl:for-each-group中,使用sum(current-group()/card-values/card-value/amount)计算总数。