[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Tree Fragment - How do I test it AND output it?

Subject: RE: Tree Fragment - How do I test it AND output it?
From: "Chris Bayes" <chris@xxxxxxxxxxx>
Date: Tue, 18 Dec 2001 08:27:23 -0000
tree drawing test
David,
Not sure what you mean (it's early). You can't do both. Well you can but
you can't recurse returning a value to the calling template and output
nodes to the result tree at the same time. Here are a few examples that
show a few things you can do.

<?xml version="1.0" ?>
<values a="3" b="5">
</values>


<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
extension-element-prefixes="msxsl"
>
	<xsl:template match="/values">
		<xsl:variable name="resultFromTemplateValue">
            <xsl:call-template name="namedTemplateValue"/>
        </xsl:variable>
		<xsl:variable name="resultFromTemplateRtf">
            <xsl:call-template name="namedTemplateRtf"/>
        </xsl:variable>
		<svg> ... here is some stuff
	         I actually want to output, because I'm drawing svg.
	         <g><xsl:value-of
select="$resultFromTemplateValue"/></g>
	         <g><xsl:value-of select="$resultFromTemplateRtf"/></g>
	         <g><xsl:call-template name="namedTemplateValue"/></g>
	         <g><xsl:call-template name="namedTemplateRtf"/></g>
	    	 <g>A Result <xsl:value-of
select="msxsl:node-set($resultFromTemplateRtf)/a *
msxsl:node-set($resultFromTemplateRtf)/b"/></g>
	    </svg>
	</xsl:template>
	
	<xsl:template name="namedTemplateValue">
		<xsl:variable name="resultFromTemplate">
		  <!--you would call the template again here-->
              <xsl:value-of select="@a * @b" />
            </xsl:variable> 
         <xsl:if test="$resultFromTemplate != 0"><g>[Result !=
0]</g></xsl:if>
    	   <xsl:value-of select="$resultFromTemplate"/>
	</xsl:template>
	
	<xsl:template name="namedTemplateRtf">
		<xsl:variable name="resultFromTemplate">
              <!--you would call the template again here-->
		  <a><xsl:value-of select="@a" /></a>
              <b><xsl:value-of select="@b" /></b>
            </xsl:variable> 
            <xsl:if test="msxsl:node-set($resultFromTemplate)/a *
msxsl:node-set($resultFromTemplate)/b != 0"><g>[Result !=
0]</g></xsl:if>
    	      <xsl:copy-of select="$resultFromTemplate"/>
	</xsl:template>
</xsl:stylesheet>

Produces

<?xml version="1.0" encoding="UTF-16" ?> 
<svg>
  ... here is some stuff I actually want to output, because I'm drawing
svg. 
  <g>[Result != 0]15</g> 
  <g>[Result != 0]35</g> 
  <g>
      <g>[Result != 0]</g> 
      15 
  </g>
  <g>
      <g>[Result != 0]</g> 
      <a>3</a> 
      <b>5</b> 
  </g>
  <g>A Result 15</g>
</svg>

Ciao Chris

XML/XSL Portal
http://www.bayes.co.uk/xml


> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> David Penton
> Sent: 18 December 2001 05:08
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject:  Tree Fragment - How do I test it AND output it?
> 
> 
> How do I both test the "return" value from a template, and 
> output some of the result nodes?  I have written a recursive 
> template that is intended to "draw" some xml as svg.  The 
> template must do some calculations about the depth of the 
> input xml, and about its "width" (i.e. how many children a 
> particular node has.  My problem is that I do not know how to 
> both get a "return" value from a template that I can test 
> (i.e. treating the named template like a kind of function), 
> and also get output from it:
> 
> Roughly, I want to do this:
> 
> <xsl:template name="namedTemplate">
>     <svg> ... here is some stuff
>          I actually want to output, because I'm drawing svg.
>     </svg>
> 
>    <!--
>         but I need to compute a value via a recursive call
>         to this same template:
>     -->
> 
>         <xsl:variable name="resultFromTemplate">
>             <xsl:call-template name="namedTemplate">
>         </xsl:variable>
> 
>         <!-- and use the "returned" value: -->
> 
>         <xsl:if test="$resultFromTemplate != 0"> ...</xsl:if>
> 
>    <!--
>         Here I'll "return" a value computed in this
>         named template, to control processing in the calling
>         template (i.e. the earlier instance of this same one):
>     -->
> 
>     <xsl:value-of select="$somethingCalculatedHere"/>
> 
> </xsl:template>
> 
> 
> Is there a way to do this?  I suppose, to get at the results, 
> I shall have to convert to a nodelist.  But I don't really 
> see how to both use the tree as a return value, and also to output it.
> 
> Does this make sense?
> 
> - Dave Penton -
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.