【问题标题】:XSLT transformation (XML to CSV)XSLT 转换(XML 到 CSV)
【发布时间】: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>&#10;&#10;</xsl:text>
<xsl:text>SNo.</xsl:text>
<xsl:text>&#09;</xsl:text>
<xsl:text>Policy #</xsl:text>
<xsl:text>&#09;</xsl:text>
<xsl:text>Customer #</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>GP</xsl:text>
<xsl:text>&#09;</xsl:text>
<xsl:text>NP</xsl:text>
<xsl:text>&#09;</xsl:text>
<xsl:text>Total Commission</xsl:text>
<xsl:text>&#10;</xsl:text>
<xsl:for-each-group select="Policies" group-by="Organization"> <!--Group by Organization-->
<xsl:value-of select="Organization"/> <!--Display the Organization-->
<xsl:text>&#10;</xsl:text>
<xsl:text>&#10;</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>&#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="count(distinct-values(current-group()/Addendas))"/> <!-- Getting Distinct Count of Addendas while it is not blank-->
<xsl:text>&#09;</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>&#09;</xsl:text>
<xsl:value-of select="GP"/>
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="NP"/>
<End of GP & NP-->
<xsl:text>&#09;</xsl:text>
<xsl:value-of select="sum(current-group()/CommAmt)"/>
<xsl:text>&#10;</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)"/>

请原谅请求的大小。我们将很乐意接受任何帮助。

【问题讨论】:

  • &lt;xsl:value-of select="count(distinct-values(current-group()/Addendas))"&gt; 这个 xsl:value-of 没有结束标签,你能检查一下添加吗?
  • 这是一个错字...在上面的 xsl 中添加了相同的内容。但是我不确定如何检查空白标签,因为目前它给了我价值 '3' 而它应该是 '2'
  • 好吧,你想检查空白标签的问题并不清楚,我认为问题与xsl:value-of有关,除非我的理解有误,否则你能更新问题
  • yes 生成报告指向第一个 xsl:value-of 标记时出错,当我尝试逐行应用时,发现了其他问题。根据要求更新了问题。

标签: xml csv xslt


【解决方案1】:

您需要从样式表中删除这一行(第 31 行):

<xsl:for-each-group select="position()"/> <!--Trying to generate Sequence Number-->

另请注意,您的 &lt;xsl:template match="/ReportIo"&gt; 假定 ReportIo 是根元素 - 但您向我们展示的输入有一个 &lt;Message&gt; 开始标签和一个 &lt;/SiebelMessage&gt; 结束标签,使其成为格式错误的 XML。

【讨论】:

  • 感谢 Michael 的回复,我已将其删除,但仍出现相同问题,指向行
  • 请稍等,我不熟悉您分享的工具/链接。 (需要做一些修改)我会用我系统中的实时数据再试一次。
  • @AnnaJoel 请告诉我们您正在使用什么 XSLT 处理器(您提到的“系统”)。此外,请确保在上面的问题中,您准确地显示了您输入自己系统的 XSLT 代码和 XML 输入。
  • @Mathias 我在 Siebel 系统中使用称为“EAI XSLT 服务”的内置业务服务。我知道它支持 XSLT 2.0..我的问题中显示的 XSLT 代码和 XML 与缩短的名称和数据相同
  • 能否请您看一下“xsltransform.net/pPzifpL/1”我已经粘贴了我系统中使用的确切 xml 和 xsl,但不确定如何运行转换
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2019-02-02
  • 2013-02-20
  • 2017-05-23
  • 2011-10-28
相关资源
最近更新 更多