【问题标题】:Group within a Group XSLT 1.0 with Sum & Count of Distinct Values使用不同值的总和和计数在组内分组 XSLT 1.0
【发布时间】:2016-01-12 07:00:55
【问题描述】:

我想使用 XSLT 1.0 在 Current-Group 中实现按功能分组...我已经设法获得基于“组织”的顶级分组,但使用“封面”的子组;我失败了:(

(http://xsltransform.net/pPzifpL/16) 具有当前使用的 XML 和 XSLT 设置。

我还需要应用 Sum(Current-Group()/SumInsured) 和 distinct(Addenda) 计数,但 1.0 不支持...请专家帮助我。

预期输出:(文本)

Client Sum Insured Report

UK
SNo.    Policy Number   Customer Name   Cover Note #    No. of Addendas Sum Insured Total Commission
 1       POL1           ABC             50242           2               40000       65
 2       POL2           XYZ             12345           1               30000       30
Totals :                                                                70000       95

US
SNo.    Policy Number   Customer Name   Cover Note #    No. of Addendas Sum Insured Total Commission
 1                      JKL             45678           0               10000       10
Totals :                                                                10000       10

XML:

<?xml version="1.0" encoding="UTF-8"?><?Siebel-Property-Set EscapeNames="true"?><SiebelMessage MessageId="1-OC05" IntObjectName="Client Sum Insured Report IO" MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">
<ListOfClientSumInsuredReportIo>
    <GroupPolicies>
     <Addenda>50242-1</Addenda>
     <CommAmt>50</CommAmt>
     <Cover>50242</Cover>
     <Customer>ABC</Customer>
     <Policy>POL1</Policy>
     <SumInsured>10000</SumInsured>
     <Organization>UK</Organization>
    </GroupPolicies>
    <GroupPolicies>
     <Addenda>50242-2</Addenda>
     <CommAmt>5</CommAmt>
     <Cover>50242</Cover>
     <Customer>ABC</Customer>
     <Policy>POL1</Policy>
     <SumInsured>20000</SumInsured>
     <Organization>UK</Organization>
    </GroupPolicies>
    <GroupPolicies>
     <Addenda></Addenda>
     <CommAmt>10</CommAmt>
     <Cover>50242</Cover>
     <Customer>ABC</Customer>
     <Policy>POL1</Policy>
     <SumInsured>10000</SumInsured>
     <Organization>UK</Organization>
    </GroupPolicies>
    <GroupPolicies>
     <Addenda>12345-1</Addenda>
     <CommAmt>20</CommAmt>
     <Cover>12345</Cover>
     <Customer>XYZ</Customer>
     <Policy>POL2</Policy>
     <SumInsured>20000</SumInsured>
     <Organization>UK</Organization>
    </GroupPolicies>
    <GroupPolicies>
     <Addenda></Addenda>
     <CommAmt>10</CommAmt>
     <Cover>12345</Cover>
     <Customer>XYZ</Customer>
     <Policy>POL2</Policy>
     <SumInsured>10000</SumInsured>
     <Organization>UK</Organization>
    </GroupPolicies>
    <GroupPolicies>
     <Addenda></Addenda>
     <CommAmt>10</CommAmt>
     <Cover>45678</Cover>
     <Customer>JKL</Customer>
     <Policy></Policy>
     <SumInsured>10000</SumInsured>
     <Organization>US</Organization>
    </GroupPolicies>
</ListOfClientSumInsuredReportIo>

使用 XSLT:

<?xml version="1.0" encoding="utf-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" indent="yes"/>      
      <xsl:template match="/SiebelMessage/ListOfClientSumInsuredReportIo">
  <xsl:text>&#09;&#09;</xsl:text>
  <xsl:text>Client Sum Insured Report</xsl:text>
  <xsl:text>&#10;</xsl:text>
        <xsl:apply-templates select="GroupPolicies[not(preceding-sibling::GroupPolicies/Organization = Organization)]/Organization" />
  </xsl:template>

  <xsl:template match="GroupPolicies" >
        <xsl:variable name="count" select="position()"/>
        <!--xsl:value-of select="{$count}"/-->
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="Policy"/>
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="Customer"/>
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="Cover"/>
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="Addenda"/> <!-- Getting Distinct Count of Addendas while it is not blank-->
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="SumInsured"/>
        <xsl:text>&#09;</xsl:text>
        <xsl:value-of select="CommAmt"/>   
        <xsl:text>&#10;</xsl:text>            
  </xsl:template>        

  <xsl:template match="Organization" >
        <xsl:text>&#10;</xsl:text>
        <xsl:text>SNo.</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>Policy Number</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>Customer Name</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>Cover Note #</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>No. of Addendas</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>Sum Insured</xsl:text>
        <xsl:text>&#09;</xsl:text>
        <xsl:text>Total Commission</xsl:text>
        <xsl:text>&#10;</xsl:text>

     <xsl:variable name="temp" select="." />         
     <xsl:apply-templates select="//GroupPolicies[Organization = current()]" />

     </xsl:template>
   </xsl:stylesheet>

感谢您的任何建议。

【问题讨论】:

  • 请在此处发布您的 xslt 和 xml,而不是仅发布在链接上(如果您愿意,可以同时发布)。这样,如果该链接消失,它就不会消失。
  • 按要求发布。

标签: xml text xslt-1.0 grouping distinct-values


【解决方案1】:

更改(链接上的第 47 行)

<xsl:apply-templates select="//GroupPolicies[Organization = current()]" />

<xsl:apply-templates select="//GroupPolicies[Organization = current() and not(preceding-sibling::GroupPolicies/Cover=Cover)]" />

更改(第 21、23、25 行)

<xsl:value-of select="Addenda"/>
<xsl:value-of select="SumInsured"/>
<xsl:value-of select="CommAmt"/> 

<xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()&gt;0])"/>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/CommAmt)"/> 

更改(第 13 行)

<!--xsl:value-of select="{$count}"/-->

<xsl:value-of select="$count"/>

您需要稍微清理一下间距/格式,但这会产生您所需的输出。

编辑添加了 OP 在评论中询问的其他要求

要将组织添加到表格顶部,只需添加

<xsl:value-of select="."/>

到组织模板的顶部。

要添加每个表的总数,请添加以下行

<xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/>
<xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/CommAmt)"/>

到组织模板的底部(在 apply-templates 调用之后),带有适当的间距和回车格式。

【讨论】:

  • 谢谢你,马修,我工作得很好。我想我会这么快得到解决方案。还有一个请求,我想在每张桌子之前显示组织。可以告诉我在哪里放置语法。
  • 最后也可以有每张桌子的总数吗?我在上面附加了我的输出语句以指示所需的。谢谢一百万。
  • 作为组织模板的第一行(将其添加为第 30 行,将回车行向下移动一个),只需添加 &lt;xsl:value-of select="."/&gt;
  • 完成谢谢。您可能已经猜到我对 XSLT 一无所知。请问有没有可能的总和。
  • 编辑了答案以提供这些表格范围的总数。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 2014-11-25
  • 1970-01-01
  • 2011-10-27
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多