P
Per Jørgen Vigdal
I have a XML that I need to map.
The XML goes like:
<Children>
<Child>
<References>
<External>
<Reference name="filename" value="1.dat"/>
<Reference name="invoicenr" value="1111111"/>
<Reference name="invoicer_name" value="Bill"/>
<Reference name="invoiceref" value="bbbbbb"/>
</External>
</References>
</Child>
<Child>
<References>
<External>
<Reference name="filename" value="2.dat"/>
<Reference name="invoicenr" value="222222"/>
<Reference name="invoicer_name" value="Bill"/>
<Reference name="invoiceref" value="bbbbbb"/>
</External>
</References>
</Child>
<Child>
<References>
<External>
<Reference name="filename" value="3.dat"/>
<Reference name="invoicenr" value="33333"/>
<Reference name="invoicer_name" value="Clinton"/>
<Reference name="invoiceref" value="ccccc"/>
</External>
</References>
</Child>
</Children>
I want the structure to map to:
<Senders>
<Sender>
<invoicer_name>Bill</invoicer_name>
<invoiceref>bbbbbb</invoiceref>
<Items TotalItems="2"/>
</Sender>
<Sender>
<invoicer_name>Clinton</invoicer_name>
<invoiceref>ccccc</invoiceref>
<Items TotalItems="1"/>
</Sender>
</Senders>
I have tried to use the "Muenchian Grouping" method, but am not able to
obtain both
<invoicer_name> and <invoiceref> under the <Sender> tag
Here is my xsl :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xslutput method="xml" indent="yes"/>
<xslutput encoding="ISO-8859-1"/>
<xsl:key name="kDistinctSender"
match="Children/Child/References/External/Reference[@name='invoicer_name']/@
value" use="."/>
<xsl:template match="/">
<Senders>
<!-- go through distinct InvoicerName -->
<xsl:for-each
select="/Children/Child/References/External/Reference[@name='invoicer_name']
/@value[generate-id()=generate-id(key('kDistinctSender',.))]">
<!-- sort by InvoicerName -->
<xsl:sort select="."/>
<Sender>
<xsl:variable name="InvoicerName">
<xsl:value-of select="."/>
</xsl:variable>
<InvoicerName>
<xsl:value-of select="$InvoicerName"/>
</InvoicerName>
<Items TotalItems="{count(key('kDistinctSender',.))}">
</Items>
</Sender>
</xsl:for-each>
</Senders>
</xsl:template>
</xsl:stylesheet>
The XML goes like:
<Children>
<Child>
<References>
<External>
<Reference name="filename" value="1.dat"/>
<Reference name="invoicenr" value="1111111"/>
<Reference name="invoicer_name" value="Bill"/>
<Reference name="invoiceref" value="bbbbbb"/>
</External>
</References>
</Child>
<Child>
<References>
<External>
<Reference name="filename" value="2.dat"/>
<Reference name="invoicenr" value="222222"/>
<Reference name="invoicer_name" value="Bill"/>
<Reference name="invoiceref" value="bbbbbb"/>
</External>
</References>
</Child>
<Child>
<References>
<External>
<Reference name="filename" value="3.dat"/>
<Reference name="invoicenr" value="33333"/>
<Reference name="invoicer_name" value="Clinton"/>
<Reference name="invoiceref" value="ccccc"/>
</External>
</References>
</Child>
</Children>
I want the structure to map to:
<Senders>
<Sender>
<invoicer_name>Bill</invoicer_name>
<invoiceref>bbbbbb</invoiceref>
<Items TotalItems="2"/>
</Sender>
<Sender>
<invoicer_name>Clinton</invoicer_name>
<invoiceref>ccccc</invoiceref>
<Items TotalItems="1"/>
</Sender>
</Senders>
I have tried to use the "Muenchian Grouping" method, but am not able to
obtain both
<invoicer_name> and <invoiceref> under the <Sender> tag
Here is my xsl :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xslutput method="xml" indent="yes"/>
<xslutput encoding="ISO-8859-1"/>
<xsl:key name="kDistinctSender"
match="Children/Child/References/External/Reference[@name='invoicer_name']/@
value" use="."/>
<xsl:template match="/">
<Senders>
<!-- go through distinct InvoicerName -->
<xsl:for-each
select="/Children/Child/References/External/Reference[@name='invoicer_name']
/@value[generate-id()=generate-id(key('kDistinctSender',.))]">
<!-- sort by InvoicerName -->
<xsl:sort select="."/>
<Sender>
<xsl:variable name="InvoicerName">
<xsl:value-of select="."/>
</xsl:variable>
<InvoicerName>
<xsl:value-of select="$InvoicerName"/>
</InvoicerName>
<Items TotalItems="{count(key('kDistinctSender',.))}">
</Items>
</Sender>
</xsl:for-each>
</Senders>
</xsl:template>
</xsl:stylesheet>