Xml XSLT将具有相同ID的行项目组合到单独的记录中
尝试使用XSLT在一个“记录”下动态组合/分组具有相同“发票id”值的行项目(标题、行、费用) 在输入XML中,有多个项目,例如标题、行、费用,其出现次数是无限的 在输出XML中,我们试图在一个父节点“记录”下对发票id相等的标题、行和费用进行分组。父节点“记录”的重复次数与输入XML中发票id的重复次数相同 请在下面找到输入和预期输出: 输入XML 输入XML如下所示:Xml XSLT将具有相同ID的行项目组合到单独的记录中,xml,xslt,xslt-2.0,xslt-grouping,Xml,Xslt,Xslt 2.0,Xslt Grouping,尝试使用XSLT在一个“记录”下动态组合/分组具有相同“发票id”值的行项目(标题、行、费用) 在输入XML中,有多个项目,例如标题、行、费用,其出现次数是无限的 在输出XML中,我们试图在一个父节点“记录”下对发票id相等的标题、行和费用进行分组。父节点“记录”的重复次数与输入XML中发票id的重复次数相同 请在下面找到输入和预期输出: 输入XML 输入XML如下所示: <?xml version="1.0" encoding="utf-8"
<?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>
标题
5.
标题
6.
线
5.
线
6.
冲锋
5.
10
冲锋
5.
11
冲锋
6.
13
冲锋
6.
14
输出XML
预计产出如下
<?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>
标题
5.
线
5.
冲锋
5.
10
冲锋
5.
11
标题
6.
线
6.
冲锋
6.
13
冲锋
6.
14
请帮忙。找到了答案:
<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>
要在XSLT 1.0中实现同样的效果,请使用以下方法:
<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>
谢谢大家!
问候
Vishakha Khona请就您在尝试完成此任务时遇到的困难提出具体问题。否则,看起来您只是在找人为您编写代码。--您可以在这里找到几个起点:顺便说一句,如果每个发票只有一个
标题
,并且有一个不同的发票id
,那么这是一个很小的问题:只需为每个标题
创建一个记录
,然后使用。