简体   繁体   English

使用XSLT 1.0的逗号分隔的子组与组

[英]Comma Separated Child Group with Group, using XSLT 1.0

I am having trouble adding a Comma separated group within my XSLT script. 我在XSLT脚本中添加逗号分隔的组时遇到问题。 Column "Insured" is the targeted field which contains child tags that I would like to add as a comma delimited string into my report. “已保险”列是目标字段,其中包含一些子标记,我希望这些子标记以逗号分隔的字符串添加到我的报告中。

Expected O/P: 预期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:

<?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 Used: 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/ListOfGroupPolicies">
    <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="InsuredAccount"/> <!-- 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;</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>

Could someone please help me, if it is possible at all. 如果有可能的话,请有人帮我。

First thing, instead of 第一件事,而不是

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

you have to use the full relative path (starting from current <GroupPolicies> element): 您必须使用完整的相对路径(从当前的<GroupPolicies>元素开始):

<xsl:value-of select="ListOfGroupPolicies_Insured/GroupPolicies_Insured/InsuredAccount"/>

to access the <InsuredAccount> element. 访问<InsuredAccount>元素。 But then you will still get only the first occurrence in each <GroupPolicies> item. 但是,在每个<GroupPolicies>项目中,您仍然只会获得第一个匹配项。 So in order to get all values and separate them with a comma, you should use 因此,为了获取所有值并用逗号分隔它们,您应该使用

<xsl:for-each select="ListOfGroupPolicies_Insured/GroupPolicies_Insured/InsuredAccount">
    <xsl:value-of select="."/>
    <xsl:if test="not(position()=last())">, </xsl:if>
</xsl:for-each>
    <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>

This is how you do sorting inside <xsl:for-each> . 这是您在<xsl:for-each>内部进行排序的方式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM