This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
How to use an attribute value passed as a param to a named template forpattern matching
- To: xsl-list at lists dot mulberrytech dot com
- Subject: [xsl] How to use an attribute value passed as a param to a named template forpattern matching
- From: "Neal Mulvenna" <mulvenna at us dot ibm dot com>
- Date: Sun, 11 Mar 2001 22:08:52 -0500
- Reply-To: xsl-list at lists dot mulberrytech dot com
Hi, this is my first post to this newly discovered usergroup. I am
experimenting with using XSLT in an integration environment for XML-XML
transforms. More about that in future posts. right now I'm trying to find
out how to use named templates with pattern matching info passed to them as
params. The example included shows three different named templates:
- "oneparam" template (param = element to be matched) works fine, although
I am not sure why. I found the solution in the FAQ, but would like to
understand why it works and why the 'intuitively obvious' way doesn't.
Suggested reading please.
- "twoparam" template doesn't work. This is just one of many that I've
tried, all fail. What is the trick for handling the attribute value
properly?
- "simple" template works fine, the pattern matching was first done in the
main template. But the only way I know of to properly position prior to
the named template call is to do a for-each block, even if I know there is
just a single occurence. Is this inefficient?
And, while I'm at it, what is wrong with my single total line sum( a * b)
statement in the example (commented out because of the error it generates)?
I tried a couple things from the Math examples in the FAQ, no luck.
I am using Lotus xsl 2.0.0 (xalan) from the IBM alphaworks site
Thanks in advance for any insight you may provide. On to the example:
First the input XML, NealExample.xml:
<!-- NealExample.xml -->
<Top>
<Repeater index="1">
<Try1>
<Value>1</Value>
</Try1>
<Try2 type="a">
<Value>2</Value>
</Try2>
<Try2 type="b">
<Value>3</Value>
</Try2>
</Repeater>
<Repeater index="2">
<Try1>
<Value>11</Value>
</Try1>
<Try2 type="a">
<Value>12</Value>
</Try2>
<Try2 type="b">
<Value>3.1</Value>
</Try2>
</Repeater>
</Top>
Now the xsl, NealExample.xsl
<xsl:stylesheet version="1.0" xmlns:xsl
="http://www.w3.org/1999/XSL/Transform">
<!--
========================================================================
NealExample.xsl
========================================================================
-->
<xsl:template match="/">
<Output>
<xsl:for-each select="//Repeater">
<Group>
<Note><xsl:text>hello</xsl:text></Note>
<Catch1>
<xsl:call-template name="oneparam">
<xsl:with-param name="p_node">Try1</xsl:with-param>
</xsl:call-template>
</Catch1>
<Catch2>
<xsl:call-template name="twoparam">
<xsl:with-param name="p_node">Try2</xsl:with-param>
<!-- <xsl:with-param name="p_attr">a</xsl:with-param> -->
<xsl:with-param name="p_attr" select="a"/>
</xsl:call-template>
</Catch2>
<xsl:for-each select="Try2[@type='b']">
<Catch3>
<xsl:call-template name="simple"/>
</Catch3>
</xsl:for-each>
</Group>
</xsl:for-each>
<Totals>
<Total_1>
<xsl:value-of select="sum(//Try2[@type='b']/Value)"/>
</Total_1>
<Total_2x3>
<!-- Following commented out because it gives this error:
XSLT Error (javax.xml.transform.TransformerException): Can not
convert #NUMBER to a NodeList!
<xsl:value-of select="sum(//Try2[@type='a']/Value * //Try2[@type='b']/Value)"/>
end of comment-out -->
</Total_2x3>
</Totals>
</Output>
</xsl:template>
<!-- ========== named templates follow ========== -->
<xsl:template name="oneparam">
<xsl:param name="p_node">.</xsl:param>
<xsl:value-of select="*[name()=$p_node]/Value"/>
</xsl:template>
<xsl:template name="twoparam">
<xsl:param name="p_node">.</xsl:param>
<xsl:param name="p_attr"></xsl:param>
<xsl:value-of select="*[name()=$p_node][(@type=$p_attr)]/Value"/>
</xsl:template>
<xsl:template name="simple">
<xsl:value-of select="./Value"/>
</xsl:template>
</xsl:stylesheet>
And this is the generated output XML:
<?xml version="1.0" encoding="UTF-8"?>
<Output>
<Group>
<Note>hello</Note>
<Catch1>1</Catch1>
<Catch2/>
<Catch3>3</Catch3>
</Group>
<Group>
<Note>hello</Note>
<Catch1>11</Catch1>
<Catch2/>
<Catch3>3.1</Catch3>
</Group>
<Totals>
<Total_1>6.1</Total_1>
<Total_2x3/>
</Totals>
</Output>
Neal Mulvenna, IBM Application Integration and Middleware Services and Solutions
Internet: mulvenna@us.ibm.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list