Преобразование нескольких xml элементов в один комплексный xml элемент.
Я бы хотел сгруппировать дочерние элементы в один комплексный xml, используя родительское значение.
В приведенном примере , источник xml содержит две xml записи для AUDIT_ID = 1.
На основе значения AUDIT_ID мы можем объединить два в один, как указано в цели xml, используя xslt?
Источник xml:
<Header>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI_ID>100</ESI_ID>
<ESI_NAME>AB</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI_ID>101</ESI_ID>
<ESI_NAME>BC</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI_ID>103</ESI_ID>
<ESI_NAME>TH</ESI_NAME>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI_ID>104</ESI_ID>
<ESI_NAME>UI</ESI_NAME>
</Audit_records>
</Header>
Цель Xml:
<Header>
<Audit_records>
<AUDIT_ID>1</AUDIT_ID>
<ESI>
<ESI_ID>100</ESI_ID>
<ESI_NAME>AB</ESI_NAME>
</ESI>
<ESI>
<ESI_ID>101</ESI_ID>
<ESI_NAME>BC</ESI_NAME>
</ESI>
</Audit_records>
<Audit_records>
<AUDIT_ID>2</AUDIT_ID>
<ESI>
<ESI_ID>103</ESI_ID>
<ESI_NAME>TH</ESI_NAME>
</ESI>
<ESI>
<ESI_ID>104</ESI_ID>
<ESI_NAME>UI</ESI_NAME>
</ESI>
</Audit_records>
</Header>
Используется xslt:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/getrecord"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://xmlns.oracle.com/ATAS_BPEL">
<!--<xsl:key name="myaudit" match="/ns0:getrecordOutputCollection/ns0:getrecordOutput" use="/ns0:getrecordOutputCollection/ns0:getrecordOutput/ns0:AUDIT_ID"/> -->
<xsl:key match="Audit_records" name="myaudit" use="AUDIT_ID"/>
<xsl:template match="/">
<ns1:Header>
<xsl:for-each select="/ns0:Header/ns0:Audit_records[generate-id() = generate-id(key('myaudit',AUDIT_ID)[1])]">
<xsl:sort select="AUDIT_ID" order="ascending" data-type="number" />
<ns1:CARF>
<ns1:Header>
<ns1:AUDIT_ID>
<xsl:value-of select="ns0:AUDIT_ID"/>
</ns1:AUDIT_ID>
<ns1:ESI >
<ns1:ESI_ID>
<xsl:value-of select="key('myaudit',AUDIT_ID)/ns0:ESI_ID"/>
</ns1:ESI_ID>
<ns1:ESI_NAME>
<xsl:value-of select="key('myaudit',AUDIT_ID)/ns0:ESI_NAME"/>
</ns1:ESI_NAME>
</ns1:ESI>
</ns1:Header>
</ns1:CARF>
</xsl:for-each>
</ns1:AUDITRECORDS>
</xsl:template>
</xsl:stylesheet>