【发布时间】:2016-01-11 07:36:46
【问题描述】:
我是 xslt 编程的新手,希望在下面得到您的帮助。
我必须从 XML 生成一个 CSV 报告,并具有以下外观。 (我不确定是否可以运行总计)
预期输出:
Sum Insured Report
UK
Sl.No. Policy # Customer # Cover Note # No. of Addendas Sum Insured GP(SumCustDeb - SumCustCred) NP(SumInsCred - SumInsDeb) Total Commission
1 414227 3321 50242 2 21000 1700 1700 850
2 ABC 12345 0 2000 500 500 10
3 1A2B XYZ 98765 1 60000 100 100 60
Total: 83000 2300 2300 920
XML:
<?xml version="1.0" encoding="UTF-8"?><?Siebel-Property-Set EscapeNames="true"?><Message MessageId="1-OC05" IntObjectName="Report IO" MessageType="Integration Object" IntObjectFormat="Hierarchical">
<ReportIo>
<Policies>
<Addenda>50242-1</Addenda>
<CommAmt>700</CommAmt>
<Cover>50242</Cover>
<Customer>3321</Customer>
<Policy>414227</Policy>
<SumCustCred>500</SumCustCred>
<SumCustDeb>1000</SumCustDeb>
<SumInsCred>1000</SumInsCred>
<SumInsDeb>500</SumInsDeb>
<SumInsured>10000</SumInsured>
<Organization>UK</Organization>
</Policies>
<Policies>
<Addenda>50242-2</Addenda>
<CommAmt>50</CommAmt>
<Cover>50242</Cover>
<Customer>3321</Customer>
<Policy>414227</Policy>
<SumCustCred>0</SumCustCred>
<SumCustDeb>500</SumCustDeb>
<SumInsCred>500</SumInsCred>
<SumInsDeb>0</SumInsDeb>
<SumInsured>1000</SumInsured>
<Organization>UK</Organization>
</Policies>
<Policies>
<Addenda></Addenda>
<CommAmt>100</CommAmt>
<Cover>50242</Cover>
<Customer>3321</Customer>
<Policy>414227</Policy>
<SumCustCred>0</SumCustCred>
<SumCustDeb>700</SumCustDeb>
<SumInsCred>700</SumInsCred>
<SumInsDeb>0</SumInsDeb>
<SumInsured>10000</SumInsured>
<Organization>UK</Organization>
</Policies>
<Policies>
<Addenda></Addenda>
<CommAmt>10</CommAmt>
<Cover>12345</Cover>
<Customer>ABC</Customer>
<Policy></Policy>
<SumCustCred>0</SumCustCred>
<SumCustDeb>500</SumCustDeb>
<SumInsCred>500</SumInsCred>
<SumInsDeb>0</SumInsDeb>
<SumInsured>2000</SumInsured>
<Organization>UK</Organization>
</Policies>
<Policies>
<Addenda></Addenda>
<CommAmt>50</CommAmt>
<Cover>98765</Cover>
<Customer>XYZ</Customer>
<Policy>1A2B</Policy>
<SumCustCred>0</SumCustCred>
<SumCustDeb>0</SumCustDeb>
<SumInsCred>0</SumInsCred>
<SumInsDeb>0</SumInsDeb>
<SumInsured>10000</SumInsured>
<Organization>UK</Organization>
</Policies>
<Policies>
<Addenda>98765-1</Addenda>
<CommAmt>10</CommAmt>
<Cover>98765</Cover>
<Customer>XYZ</Customer>
<Policy>1A2B</Policy>
<SumCustCred>0</SumCustCred>
<SumCustDeb>100</SumCustDeb>
<SumInsCred>100</SumInsCred>
<SumInsDeb>0</SumInsDeb>
<SumInsured>50000</SumInsured>
<Organization>UK</Organization>
</Policies>
</ReportIo>
</SiebelMessage>
已使用 XSLT,但在尝试将组织显示为“英国”时,我陷入了第一步。系统提示“XSLT 处理异常:XSLT 错误:样式表中此位置不允许 xsl:value-of”
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://www.canto.com/ns/Export/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs">
<xsl:output method="text" indent="yes" encoding="utf-8" standalone="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/ReportIo">
<xsl:text>Sum Insured Report</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>SNo.</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Policy #</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Customer #</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Cover Note #</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>GP</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>NP</xsl:text>
<xsl:text>	</xsl:text>
<xsl:text>Total Commission</xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each-group select="Policies" group-by="Organization"> <!--Group by Organization-->
<xsl:value-of select="Organization"/> <!--Display the Organization-->
<xsl:text> </xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each-group select="current-group()" group-by="Cover">
<xsl:for-each-group select="position()"/> <!--Trying to generate Sequence Number-->
<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:value-of select="count(distinct-values(current-group()/Addendas))"/> <!-- Getting Distinct Count of Addendas while it is not blank-->
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(current-group()/SumInsured)"/> <!-- Summation of SumInsured element within the 'Cover' group-->
<!-- Not sure how to get GP & NP, if it is at all possible>
<xsl:text>	</xsl:text>
<xsl:value-of select="GP"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="NP"/>
<End of GP & NP-->
<xsl:text>	</xsl:text>
<xsl:value-of select="sum(current-group()/CommAmt)"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
以下标签也提供了不正确的值,因为正在考虑空白附录:
<xsl:value-of select="count(distinct-values(current-group()/Addendas))"/>
这里我无法得到总和:
<xsl:value-of select="sum(current-group()/SumInsured)"/>
请原谅请求的大小。我们将很乐意接受任何帮助。
【问题讨论】:
-
<xsl:value-of select="count(distinct-values(current-group()/Addendas))">这个 xsl:value-of 没有结束标签,你能检查一下添加吗? -
这是一个错字...在上面的 xsl 中添加了相同的内容。但是我不确定如何检查空白标签,因为目前它给了我价值 '3' 而它应该是 '2'
-
好吧,你想检查空白标签的问题并不清楚,我认为问题与
xsl:value-of有关,除非我的理解有误,否则你能更新问题 -
yes 生成报告指向第一个 xsl:value-of 标记时出错,当我尝试逐行应用时,发现了其他问题。根据要求更新了问题。