[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: xsl-list Digest 10 Nov 2006 06:10:00 -0000 Issue 9
Date: Thu, 09 Nov 2006 18:16:17 -0500 To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> Subject: Re: Re: xsl-list Digest 9 Nov 2006 06:10:00 -0000 Issue 953 Message-ID:<20061109181818.GA9737@xxxxxxxxxxxxxxxxxxxxx> [snipped] Actually Wendell, searching the archives with your name helped immensely! While not an elegant 5 line stylesheet, I did figure out how to do the rows with the equivalent of a while loop, and the string chopping with the equivalent of a list loop. Thanks for the pointers! For the sake of the archive here is the stylesheet fragment for XSLT 1.0 that I mashed together to simplify the WDDX recordset based on the contextual info. <xsl:template match="var/recordset"> <xsl:variable name="recordsetName" select="../@name"/> <xsl:variable name="rowCount" select="@rowCount"/> <xsl:variable name="fieldNames" select="@fieldNames"/> <xsl:call-template name="recordsetRow"> <xsl:with-param name="recordsetName" select="$recordsetName"/> <xsl:with-param name="rowCount" select="$rowCount"/> <xsl:with-param name="fieldNames" select="$fieldNames"/> <xsl:with-param name="currentRow" select="1"/> </xsl:call-template> </xsl:template> <xsl:template name="recordsetRow"> <xsl:param name="recordsetName"/> <xsl:param name="rowCount"/> <xsl:param name="fieldNames"/> <xsl:param name="currentRow"/> <xsl:if test="$currentRow <= $rowCount"> <!-- Process current row. --> <xsl:element name="{$recordsetName}"> <xsl:call-template name="recordsetColumn"> <xsl:with-param name="fieldName" select="$fieldNames"/> <xsl:with-param name="currentRow" select="$currentRow"/> <xsl:with-param name="currentCol" select="1"/> </xsl:call-template> </xsl:element> <!-- Recurse to process next row. --> <xsl:call-template name="recordsetRow"> <xsl:with-param name="recordsetName" select="$recordsetName"/> <xsl:with-param name="rowCount" select="$rowCount"/> <xsl:with-param name="fieldNames" select="$fieldNames"/> <xsl:with-param name="currentRow" select="$currentRow + 1"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="recordsetColumn"> <xsl:param name="fieldName"/> <xsl:param name="currentRow"/> <xsl:param name="currentCol"/> <xsl:choose> <xsl:when test="contains($fieldName,',')"> <!-- Select the first value to process --> <xsl:call-template name="recordsetField"> <xsl:with-param name="fieldName" select="substring-before($fieldName,',')"/> <xsl:with-param name="currentRow" select="$currentRow"/> <xsl:with-param name="currentCol" select="$currentCol"/> </xsl:call-template> <!-- Recurse with remainder of string --> <xsl:call-template name="recordsetColumn"> <xsl:with-param name="fieldName" select="substring-after($fieldName,',')"/> <xsl:with-param name="currentRow" select="$currentRow"/> <xsl:with-param name="currentCol" select="$currentCol + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <!-- This is the last value so we don't recurse --> <xsl:call-template name="recordsetField"> <xsl:with-param name="fieldName" select="$fieldName"/> <xsl:with-param name="currentRow" select="$currentRow"/> <xsl:with-param name="currentCol" select="$currentCol"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Process of individual value here --> <xsl:template name="recordsetField"> <xsl:param name="fieldName"/> <xsl:param name="currentRow"/> <xsl:param name="currentCol"/> <xsl:variable name="fieldValue" select="child::field[@name=$fieldName]/*[position()=$currentRow]"/> <xsl:element name="{$fieldName}"> <xsl:value-of select="$fieldValue"/> </xsl:element> </xsl:template> <xsl:template match="/wddxPacket"> <partyList> <xsl:apply-templates/> </partyList> </xsl:template> When applied to the following wddx packet: <?xml version="1.0" encoding="UTF-8"?> <wddxPacket version='1.0'><header></header><data><struct> <var name='party'> <recordset rowCount='3' fieldNames='PARTY_ID,PARTY_ROLE_ID,FIRST_NAME,LAST_NAME,SUFFIX,BIRTH_DT'> <field name='PARTY_ID'> <number>2127652</number> <number>2127653</number> <number>2127654</number></field> <field name='PARTY_ROLE_ID'> <number>51</number> <number>24</number> <number>25</number></field> <field name='FIRST_NAME'> <string>Bob</string> <string>Donte</string> <string>Mike</string></field> <field name='LAST_NAME'> <string>Jones</string> <string>Smith</string> <string>Thomsone</string></field> <field name='SUFFIX'> <string></string> <string></string> <string>Jr.</string></field> <field name='BIRTH_DT'> <string></string> <dateTime>1990-6-4T0:0:0-8:0</dateTime> <string></string></field> </recordset> </var> <var name='alias'> <recordset rowCount='1' fieldNames='ALIAS_ID,PARTY_ID,FIRST_NAME,LAST_NAME'> <field name='ALIAS_ID'> <number>1</number></field> <field name='PARTY_ID'> <number>2127652</number></field> <field name='FIRST_NAME'> <string>Bobby</string></field> <field name='LAST_NAME'> <string>Joneson</string></field> </recordset> </var> </struct></data> </wddxPacket> I get the following xml output. <?xml version="1.0" encoding="UTF-8"?> <partyList> <party> <PARTY_ID>2127652</PARTY_ID> <PARTY_ROLE_ID>51</PARTY_ROLE_ID> <FIRST_NAME>Bob</FIRST_NAME> <LAST_NAME>Jones</LAST_NAME> <SUFFIX/> <BIRTH_DT/> </party> <party> <PARTY_ID>2127653</PARTY_ID> <PARTY_ROLE_ID>24</PARTY_ROLE_ID> <FIRST_NAME>Donte</FIRST_NAME> <LAST_NAME>Smith</LAST_NAME> <SUFFIX/> <BIRTH_DT>1990-6-4T0:0:0-8:0</BIRTH_DT> </party> <party> <PARTY_ID>2127654</PARTY_ID> <PARTY_ROLE_ID>25</PARTY_ROLE_ID> <FIRST_NAME>Mike</FIRST_NAME> <LAST_NAME>Thomsone</LAST_NAME> <SUFFIX>Jr.</SUFFIX> <BIRTH_DT/> </party> <alias> <ALIAS_ID>1</ALIAS_ID> <PARTY_ID>2127652</PARTY_ID> <FIRST_NAME>Bobby</FIRST_NAME> <LAST_NAME>Joneson</LAST_NAME> </alias> </partyList>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|