首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT将具有相同ID的行项组合成单独的记录

XSLT将具有相同ID的行项组合成单独的记录
EN

Stack Overflow用户
提问于 2021-05-28 18:34:33
回答 1查看 141关注 0票数 0

尝试使用XSLT动态组合/分组行项(标头、行、收费),在一个“记录”下具有相同的"invoice_id“值。

在输入XML中,有多个条目,如标头、行、电荷,它们的出现是无界的。

在输出XML中,我们试图在一个父节点"Record“下对其发票id相等的标题、行和费用进行分组。父节点"Record“重复的次数与输入XML中的发票id相同。

请在下面找到投入和预期产出:

输入XML输入XML如下:

代码语言:javascript
复制
    <?xml version="1.0" encoding="utf-8"?>
    <ns:MT_OkayToPay_Source xmlns:ns="http://kpmg.com/xi/Coupa/OkayToPay">
        <Header>
            <type>Header</type>
            <invoice_id>5</invoice_id>
        </Header>
        <Header>
            <type>Header</type>
            <invoice_id>6</invoice_id>
        </Header>
        <Line>
            <type>Line</type>
            <invoice_id>5</invoice_id>
        </Line>
        <Line>
            <type>Line</type>
            <invoice_id>6</invoice_id>
        </Line>
        <Charge>
            <type>Charge</type>
            <invoice_id>5</invoice_id>
            <invoice_charge_invoice_id>10</invoice_charge_invoice_id>
        </Charge>
        <Charge>
            <type>Charge</type>
            <invoice_id>5</invoice_id>
            <invoice_charge_invoice_id>11</invoice_charge_invoice_id>
        </Charge>
        <Charge>
            <type>Charge</type>
            <invoice_id>6</invoice_id>
            <invoice_charge_invoice_id>13</invoice_charge_invoice_id>
        </Charge>
        <Charge>
            <type>Charge</type>
            <invoice_id>6</invoice_id>
            <invoice_charge_invoice_id>14</invoice_charge_invoice_id>
        </Charge>
</ns:MT_OkayToPay_Source>

输出XML输出预期如下所示

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ns:MT_OkayToPay_Source xmlns:ns="http://kpmg.com/xi/Coupa/OkayToPay">
    <Record>
    <Header>
        <type>Header</type>
        <invoice_id>5</invoice_id>
    </Header>
    <Line>
        <type>Line</type>
        <invoice_id>5</invoice_id>
   </Line>
    <Charge>
        <type>Charge</type>
        <invoice_id>5</invoice_id>
        <invoice_charge_invoice_id>10</invoice_charge_invoice_id>
    </Charge>
    <Charge>
        <type>Charge</type>
        <invoice_id>5</invoice_id>
        <invoice_charge_invoice_id>11</invoice_charge_invoice_id>   
    </Charge>
    </Record>
    <Record>
    <Header>
        <type>Header</type>
        <invoice_id>6</invoice_id>
    </Header>
    <Line>
        <type>Line</type>
        <invoice_id>6</invoice_id>  
    </Line>
    <Charge>
        <type>Charge</type>
        <invoice_id>6</invoice_id>
        <invoice_charge_invoice_id>13</invoice_charge_invoice_id>   
    </Charge>
    <Charge>
        <type>Charge</type>
        <invoice_id>6</invoice_id>
        <invoice_charge_invoice_id>14</invoice_charge_invoice_id>   
    </Charge>
 </Record>
</ns:MT_OkayToPay_Source>

帮帮忙吧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-29 13:03:09

找到了答案:

代码语言:javascript
复制
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <root>
      <xsl:for-each-group select="*" group-by="invoice_id">
       <record>
        <xsl:copy-of select="current-group()"/>
       </record>
      </xsl:for-each-group>
 
      
     </root>
 
 </xsl:template>

</xsl:stylesheet>

要在XSLT1.0中实现同样的目标,请使用以下方法:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:key name="Records_by_invoice_id" match="*" use="invoice_id"/>

<xsl:template match="/*">
  <MT_OkayToPay_Source>
   <xsl:apply-templates/>
  </MT_OkayToPay_Source>
 </xsl:template>

<xsl:template match=
   "MT_OkayToPay_Source/*[generate-id()=generate-id(key('Records_by_invoice_id',invoice_id)[1])]">

  <record>
   <xsl:copy-of select="key('Records_by_invoice_id',invoice_id)"/>
  </record>
 </xsl:template>
 
 <xsl:template match=
   "MT_OkayToPay_Source/*[not(generate-id()=generate-id(key('Records_by_invoice_id',invoice_id)[1]))]"/>

  </xsl:stylesheet>

谢谢!

问候

维沙卡·科纳

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67743997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档