使用 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>		</xsl:text>
<xsl:text>Client Sum Insured Report</xsl:text>
<xsl:text> </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>	</xsl:text>
<xsl:value-of select="Policy"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Customer"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Cover"/>
<xsl:text>	</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>	</xsl:text>
<xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()>0])"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/CommAmt)"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="Organization">
<xsl:text> </xsl:text>
<xsl:text>SNo.</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Policy Number</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Customer Name</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Cover Note #</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Insured</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>No. of Addendas</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Sum Insured</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Total Commission</xsl:text>
<xsl:text> </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>														</xsl:text><xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/>
<xsl:text>	</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>
我想将父 "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>		</xsl:text>
<xsl:text>Client Sum Insured Report</xsl:text>
<xsl:text> </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>	</xsl:text>
<xsl:value-of select="Policy"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Customer"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Cover"/>
<xsl:text>	</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>	</xsl:text>
<xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()>0])"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/CommAmt)"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="Organization">
<xsl:text> </xsl:text>
<xsl:text>SNo.</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Policy Number</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Customer Name</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Cover Note #</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Insured</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>No. of Addendas</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Sum Insured</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Total Commission</xsl:text>
<xsl:text> </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>														</xsl:text><xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/>
<xsl:text>	</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>