xsl-list
[Top] [All Lists]

Re: [xsl] Re: WDDX Recordset generic simplification

2006-11-08 09:21:22
Dear Eric,

At 08:27 PM 11/7/2006, you wrote:

I have an excerpt of a wddx data being generated from query data in
ColdFusion 5 and I need to simplify the structure with an intermediate
xsl transform so that I can consume the simplified form in a mail merge

[snipped]

I realize the following code does not work but it is the
pull/procedural approach I keep getting stuck heading towards:

<xsl:template match="var/recordset">
        <xsl:variable name="rowCount" select="@rowCount"/>
        <xsl:variable name="fieldNames" select="@fieldNames"/>
        <xsl:for-each from="1" to="$rowCount" index="row">
                <xsl:element name="{../@name}">
                        <xsl:for-each list="$fieldNames" index="col">
                                <xsl:element name="{$fieldNames[$col]}">
<xsl:value-of select="field[(_at_)name=$col]::child[position()=$row]"/>
                                <xsl:element>
                        </xsl:for-each>
                </xsl:element>
        </xsl:for-each>
</xsl:template>

Can anyone point me towards a better approach using a push/functional
approach to make simplification of wddx recordsets contextually
generic?

First, a simple question: are you using XSLT 2.0?

The reason I ask is that in XSLT 1.0 you can't generate nodes in the result by iterating over a set of numbers, which is effectively what you are trying to do here. xsl:for-each doesn't accept "from" and "to" attributes, as its purpose is to select a set of *nodes* (from the source tree) and operate with each of them in turn as the current node. (In this, it's really just a shortcut to allow you to do this locally without calling a new template rule, which is what you'd ordinarily do.)

Due to its expanded data model, however, in XSLT 2.0 you can say

<xsl:for-each select="1 to $rowCount">...</xsl:for-each>

and (due to the semantics of the 'to' operator) operate over a sequence of numbers (integers, actually), 1 to whatever $rowCount is.

Hence, in XSLT 2.0 the correction would be a simple syntax tweak.

In XSLT 1.0, however, you would have to execute this recursively, calling a template from itself and counting up to or down from $rowCount with a parameter as you did so, to effect a stop condition. (There are examples from that in the XSL FAQ.)

Cheers,
Wendell



======================================================================
Wendell Piez                            
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>