XSLT 将具有相同 ID 的行项目合并到单独的记录中
XSLT to combine Line Items with same ID into separate records
尝试使用 XSLT 将具有相同“invoice_id”值的订单项(Header、订单项、费用)动态组合/分组到一个 'Record' 下。
在输入XML中,有Header、Line、Charge等多项出现次数无限制
在输出 XML 中,我们尝试将发票 ID 相等的 Header、Line 和 Charges 分组到一个 parent 节点“Record”下。 parent 节点“记录”重复输入 XML.
中发票 ID 的次数
请在下面找到输入和预期输出:
输入XML
输入 XML 如下:
<?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
预期输出如下
<?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>
请帮忙。
找到答案:
<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>
谢谢!
此致
维沙卡科纳
尝试使用 XSLT 将具有相同“invoice_id”值的订单项(Header、订单项、费用)动态组合/分组到一个 'Record' 下。
在输入XML中,有Header、Line、Charge等多项出现次数无限制
在输出 XML 中,我们尝试将发票 ID 相等的 Header、Line 和 Charges 分组到一个 parent 节点“Record”下。 parent 节点“记录”重复输入 XML.
中发票 ID 的次数请在下面找到输入和预期输出:
输入XML 输入 XML 如下:
<?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 预期输出如下
<?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>
请帮忙。
找到答案:
<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>
谢谢!
此致
维沙卡科纳