使用 XSLT 1.0 将父子数据组合在一个逗号分隔的排序列中

Combine Parent & Child data in one comma separated sorted column using XSLT 1.0

我想将父 "InsuredAccnt" 和子 "InsuredAccounts" 包括在一列中;逗号分隔它们,其中 InsuredAccnt(我的 XML 中的 INSA)将始终排在第一位,其余子 InsuredAccounts(我的 XML 中的 INS1 和 INS2)需要按 "InsuredShare" 排序并显示。

任何帮助都将非常有用,我不熟悉 XSLT,甚至现有代码都是由 Whosebug 上一些乐于助人的人编写的。

预计O/P:

Client Sum Insured Report

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

US
SNo.    Policy Number   Customer Name   Cover Note #    Insured             No. of Addendas     Sum Insured     Total Commission
 1                      JKL             45678           INSC                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">
<ListOfGroupPolicies>
<GroupPolicies>
 <Addenda>50242-1</Addenda>
 <CommAmt>50</CommAmt>
 <Cover>50242</Cover>
 <Customer>ABC</Customer>
 <Policy>POL1</Policy>
 <SumInsured>10000</SumInsured>
 <InsuredAccnt>INSA</InsuredAccnt>
 <Organization>UK</Organization>
 <ListOfGroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS1</InsuredAccount>
  <InsuredShare>5</InsuredShare>
  </GroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS2</InsuredAccount>
  <InsuredShare>25</InsuredShare>
  </GroupPolicies_Insured>
 </ListOfGroupPolicies_Insured>
</GroupPolicies>
<GroupPolicies>
 <Addenda>50242-2</Addenda>
 <CommAmt>5</CommAmt>
 <Cover>50242</Cover>
 <Customer>ABC</Customer>
 <Policy>POL1</Policy>
 <SumInsured>20000</SumInsured>
 <InsuredAccnt>INSA</InsuredAccnt>
  <Organization>UK</Organization>
 <ListOfGroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS1</InsuredAccount>
  <InsuredShare>5</InsuredShare>
  </GroupPolicies_Insured>
  <GroupPolicies_Insured>
   <InsuredAccount>INS2</InsuredAccount>
  <InsuredShare>25</InsuredShare>
  </GroupPolicies_Insured>
 </ListOfGroupPolicies_Insured>
</GroupPolicies>
<GroupPolicies>
 <Addenda></Addenda>
 <CommAmt>10</CommAmt>
 <Cover>50242</Cover>
 <Customer>ABC</Customer>
 <Policy>POL1</Policy>
 <SumInsured>10000</SumInsured>
 <InsuredAccnt>INSA</InsuredAccnt>
  <Organization>UK</Organization>
 <ListOfGroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS1</InsuredAccount>
  <InsuredShare>5</InsuredShare>
  </GroupPolicies_Insured>
  <GroupPolicies_Insured>
   <InsuredAccount>INS2</InsuredAccount>
  <InsuredShare>25</InsuredShare>
   </GroupPolicies_Insured>
 </ListOfGroupPolicies_Insured>
</GroupPolicies>
 <GroupPolicies>
  <Addenda>12345-1</Addenda>
  <CommAmt>20</CommAmt>
  <Cover>12345</Cover>
 <Customer>XYZ</Customer>
 <Policy>POL2</Policy>
  <SumInsured>20000</SumInsured>
  <InsuredAccnt>INSB</InsuredAccnt>
 <Organization>UK</Organization>
  <ListOfGroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS3</InsuredAccount>
  <InsuredShare>20</InsuredShare>
  </GroupPolicies_Insured>
  </ListOfGroupPolicies_Insured>
 </GroupPolicies>
 <GroupPolicies>
  <Addenda></Addenda>
 <CommAmt>10</CommAmt>
 <Cover>12345</Cover>
 <Customer>XYZ</Customer>
 <Policy>POL2</Policy>
 <SumInsured>10000</SumInsured>
 <InsuredAccnt>INSB</InsuredAccnt>
 <Organization>UK</Organization>
  <ListOfGroupPolicies_Insured>
  <GroupPolicies_Insured>
  <InsuredAccount>INS3</InsuredAccount>
  <InsuredShare>20</InsuredShare>
  </GroupPolicies_Insured>
 </ListOfGroupPolicies_Insured>
</GroupPolicies>
<GroupPolicies>
 <Addenda></Addenda>
 <CommAmt>10</CommAmt>
 <Cover>45678</Cover>
 <Customer>JKL</Customer>
 <Policy></Policy>
 <SumInsured>10000</SumInsured>
 <InsuredAccnt>INSC</InsuredAccnt>
 <Organization>US</Organization>
 <ListOfGroupPolicies_Insured />
</GroupPolicies>
</ListOfGroupPolicies>

使用的 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:for-each select="ListOfClientSumInsuredReportIo_Insured/GroupPolicies_Insured/InsuredAccount">
<xsl:value-of select="."/>
<xsl:if test="not(position()=last())"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each> <!-- Comma Separated List of Insured Accounts per Cover-->
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()>0])"/>
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/>
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/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>Insured</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() and not(preceding-sibling::GroupPolicies/Cover=Cover)]"/>
<xsl:text>Totals:</xsl:text>
<xsl:text>&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;</xsl:text><xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/>
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/CommAmt)"/>
</xsl:template>
    </xsl:stylesheet>

希望这是可以实现的...

可以使用以下语法:

    <xsl:value-of select="InsuredAccnt"/>
    <xsl:for-each select="ListOfGroupPolicies_Insured/GroupPolicies_Insured">
    <xsl:sort select="InsuredShare" order="descending" data-type="number"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="InsuredAccount"/>

而不是:

    <xsl:for-each select="ListOfClientSumInsuredReportIo_Insured/GroupPolicies_Insured/InsuredAccount">
    <xsl:value-of select="."/>
    <xsl:if test="not(position()=last())"><xsl:text>, </xsl:text></xsl:if>
    </xsl:for-each>