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

Re: Selecting and printing certain nodes

Subject: Re: Selecting and printing certain nodes
From: "Glenn MacGregor" <gtm@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 20 Feb 2004 11:31:04 -0500
foreach param
You guy's are great! Thanks so much for the help. I went on David and
Wendell's suggestions, it simplified it quite a bit and it works exactly as
I want. This is great!

I have a couple more questions...sorry...

XML snipit:
<variable name="$startDate"/>

XSL snipit:
<xsl:template match="variable">
    <xsl:if test="@name"/>
        <xsl:value-of select="@name"/>
    </xsl:if>
</xsl:template>

This prints out '$startDate' when I really want it to print the value of the
xsl:param $startDate. Is there a way to do this in XSL?

So let me explain my situation with some examples:

XML input file:
<html>
<head><title>This is the title of the document</title></head>
<body>
<table border="1" cellpadding="0">
<tr><td colspan="2"><replace with="tag">title</replace></td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<foreach param="devices">
<tr>
<td>The device is <variable> Param is P1</td>
<td>The device is <variable> Param is P2</td>
</tr>
</foreach>
</body>
</html>

So the replace just replaces itself with the text of the title name, no
problem there I use the exslt dyn:evaluate function for that.
Next is the foreach. This works by the stylesheet opening the 'devices.xml'
file using the document function and reading out the /doc/items

<xsl:template match="foreach">
<xsl:param name="var"/>
<xsl:variable name="here" select="."/>
<xsl:for-each select="document(@param)/doc/item">
<div>
<xsl:apply-templates select="$here/node()">
<xsl:with-param name="var" select="."/>
</xsl:apply-templates>
</div>
</xsl:for-each>
</xsl:template>

<xsl:template match="variable">
<xsl:param name="var"/>
<xsl:value-of select="$var"/>
</xsl:template>

This all work great. Now my question is can you think of a way to handle
nested foreach statments?

<foreach param="devices">
<tr><td colspan="2"><variable/></td></tr>
<foreach param="parameters">
<tr><td><variable/></td></tr>
</foreach>
</foreach>

Do I need to pass a variable which is an array or something

Thanks

        Glenn


----- Original Message -----
From: "David Carlisle" <davidc@xxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Thursday, February 19, 2004 6:34 PM
Subject: Re:  Selecting and printing certain nodes


>
>          <xsl:with-param name="do-sect" select="$foreachNode/*" />
>
> You threw away all the text at that pont, as * selects element nodes
> (only) If you want all child nodes use /node() not /* at the end.
>
> It still seems highly likely that a much more simple apply-templates
> based solution is possibe rather than an explicitly recursive template.
>
>
> side issue, usual complaint about misuse of word tag
>
>   I need to output all the text inside the tags
>
> It seems every one misuses tag like this but I'm not sure why. tag has a
> very specific meaning, and tags are opened with < (what used to be
> called STAGO: start tag open character) and closed with > (what used to
> be called STAGC) the stuff inside a tag consists of the element name,
> some attribute markup and some ignorable white space. You want the text
> that is explictly _not_ inside the tags. (I know this seems pedantry,
> but it really does make it harder to understand the problem when people
> say exactly the oposite of what they mean)
>
>   I need to output all the text inside the tags (expect for the
>   "variable" and "replace" tags.
>
> Why can't you just use the identity template, as Wendell suggested,
> together with a couple of templates for the variable and replace
> _elements_.?
>
> "cdata" is also a slightly confusing name for the param as CDATA also
> has a technical meaning but (in XML but not SGML) CDATA declared text
> can only appear in attribute values, not in element content.
>
>
>
> David
>
> I'm not sure I fully understood your requirement but this copies your
> foreach stuff 4 times, replacing <var/> with a dev 1... each time.
>
>
> var1.xml
> <doc>
> <item>dev1</item>
> <item>dev2</item>
> <item>dev3</item>
> <item>dev4</item>
> </doc>
>
>
> var2.xml
> <foreach param="devices">
> <tr><td><b>BOLDFACE</b> Some <var/> Text</td><td>Here</td></tr>
> <tr><td> Test11</td><td>Test</td></tr>
> </foreach>
>
>
> var3.xsl
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0">
> <xsl:template match="*">
> <xsl:param name="var"/>
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates>
>   <xsl:with-param name="var" select="$var"/>
> </xsl:apply-templates>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="foreach">
> <xsl:param name="var"/>
> <xsl:variable name="here" select="."/>
> <xsl:for-each select="document('var1.xml')/doc/item">
> <div>
> <xsl:apply-templates select="$here/node()">
>   <xsl:with-param name="var" select="."/>
> </xsl:apply-templates>
> </div>
> </xsl:for-each>
> </xsl:template>
>
> <xsl:template match="var">
> <xsl:param name="var"/>
> <span><xsl:value-of select="$var"/></span>
> </xsl:template>
> </xsl:stylesheet>
>
>
>
> $ saxon var2.xml var3.xsl
> <?xml version="1.0" encoding="utf-8"?><div>
> <tr><td><b>BOLDFACE</b> Some <span>dev1</span>
> Text</td><td>Here</td></tr>
> <tr><td> Test11</td><td>Test</td></tr>
> </div><div>
> <tr><td><b>BOLDFACE</b> Some <span>dev2</span>
> Text</td><td>Here</td></tr>
> <tr><td> Test11</td><td>Test</td></tr>
> </div><div>
> <tr><td><b>BOLDFACE</b> Some <span>dev3</span>
> Text</td><td>Here</td></tr>
> <tr><td> Test11</td><td>Test</td></tr>
> </div><div>
> <tr><td><b>BOLDFACE</b> Some <span>dev4</span>
> Text</td><td>Here</td></tr>
> <tr><td> Test11</td><td>Test</td></tr>
> </div>
>
>
>
> --
> http://www.dcarlisle.demon.co.uk/matthew
>
>  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.