i iterate through xml elemets grouping data common element value. input xml structure is:
<?xml version="1.0" encoding="utf-8"?> <data> <output outputtype="correction"> <row nodename="order_header" tablename="order_header"> <column columnname="order_number">00001</column> <column columnname="country">england</column> <column columnname="city">london</column> </row> <row nodename="order_header" tablename="order_header"> <column columnname="order_number">00002</column> <column columnname="country">england</column> <column columnname="city">birmingham</column> </row> <row nodename="order_detail" tablename="order_detail"> <column columnname="order_number">00001</column> <column columnname="book">gone wind</column> <column columnname="qty">2</column> </row> <row nodename="order_detail" tablename="order_detail"> <column columnname="order_number">00001</column> <column columnname="book">pride , prejudice</column> <column columnname="qty">3</column> </row> <row nodename="order_detail" tablename="order_detail"> <column columnname="order_number">00002</column> <column columnname="book">jane eyre</column> <column columnname="qty">1</column> </row> </output> </data> i trying create following output:
<transmission xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns="http://www.w3.org/1999/xhtml"> <ordernumber>00001</ordernumber> <country>england</country> <city>london</city> <book>gone wind</book> <qty>2</qty> <book>pride , prejudice</book> <qty>3</qty> <ordernumber>00002</ordernumber> <country>england</country> <city>birmingham</city> <book>jane eyre</book> <qty>1</qty> </transmission> here xsl have far:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns="http://www.w3.org/1999/xhtml"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/data/output[@outputtype='correction']"> <transmission> <xsl:for-each select="row[@tablename='order_header']"> <ordernumber> <xsl:value-of select="column[@columnname='order_number']" /> </ordernumber> <country> <xsl:value-of select="column[@columnname='country']" /> </country> <city> <xsl:value-of select="column[@columnname='city']" /> </city> </xsl:for-each> </transmission> </xsl:template> </xsl:stylesheet> i can output details each order header can't see how select , group correct order details. appreciated.
thanks
you can use key order details (which works in both xslt 1.0 , xslt 2.0)
<xsl:key name="detail" match="row[@nodename='order_detail']" use="column[@columnname='order_number']" /> then, order details given order number, can use key so:
<xsl:for-each select="key('detail', column[@columnname='order_number'])"> try xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:key name="detail" match="row[@nodename='order_detail']" use="column[@columnname='order_number']" /> <xsl:template match="/data/output[@outputtype='correction']"> <transmission> <xsl:for-each select="row[@tablename='order_header']"> <xsl:variable name="ordernumber" select="column[@columnname='order_number']" /> <ordernumber> <xsl:value-of select="$ordernumber" /> </ordernumber> <country> <xsl:value-of select="column[@columnname='country']" /> </country> <city> <xsl:value-of select="column[@columnname='city']" /> </city> <xsl:apply-templates select="key('detail', $ordernumber)" /> </xsl:for-each> </transmission> </xsl:template> <xsl:template match="row"> <book> <xsl:value-of select="column[@columnname='book']" /> </book> <qty> <xsl:value-of select="column[@columnname='qty']" /> </qty> </xsl:template> </xsl:stylesheet> note, switched use xsl:apply-templates instead, cut-down on nested code. used variable, avoid repetition of getting order number.
as aside, xml output want? more logical wrap each order in containing parent element so, otherwise extracting books order becomes bit more hard work.
<transmission> <order> <ordernumber>00001</ordernumber> <country>england</country> <city>london</city> <book>gone wind</book> <qty>2</qty> <book>pride , prejudice</book> <qty>3</qty> </order> <order> <ordernumber>00002</ordernumber> <country>england</country> <city>birmingham</city> <book>jane eyre</book> <qty>1</qty> </order> </transmission>
Comments
Post a Comment