Subject: RE: Using xsl:if to determine if a node is empty. From: Roger Flory <rflory@xxxxxxxxxxxx> Date: Fri, 15 Sep 2000 14:11:48 -0500 |
[Roger Flory] Thanks Jeni. You have been very helpful. Can you suggest any classes or seminars where I can learn more about XSL & XPATH? > Roger, > > You're trying to test here whether the VENDOR_ITEM_NUM element is an empty > element or not - in other words does it have any child nodes. > > You can form a node set that holds the child nodes of the current node > (the > VENDOR_ITEM_NUM element using the XPath: > > child::node() > > Note however, that this will get *any* node in the content of the element: > elements, text, processing instructions and even comments. Probably you > want to limit this to only elements and text nodes that consist of more > than just whitespace: > > child::text()[normalize-space(.)] | child::* > > or, shorter: > > text()[normalize-space(.)] | * > > These XPaths actually tell you whether the element has any content. In > fact, VENDOR_ITEM_NUM probably only takes text children anyway, and it's > only their value that you care about. If you are interested in whether > the > VENDOR_ITEM_NUM element has some textual content that isn't just > whitespace > you can get the nodes that make up that text using just: > > text()[normalize-space(.)] > > If you just run a test on that node set, then you will get 'true' if there > are any nodes in the node set, and 'false' if there aren't. But in a test > like this, then you can alternatively test whether the current node has a > 'string value' (which is formed by concatenating together the string > values > of all the text and element child nodes), so you can use: > > normalize-space(.) > > So try: > > <xsl:template match="VENDOR_ITEM_NUM"> > <tr> > <td></td> > <td> > <font size="2"> > <xsl:if test="normalize-space(.)"> > <xsl:value-of select="concat('Vendor Item number: ',.)"/> > </xsl:if> > </font> > </td> > </tr> > </xsl:template> > > If you want to use a variable to hold an empty string to test against, you > should probably define it as: > > <xsl:variable name="empty_string" select="''" /> > > as this creates an empty *string* rather than an empty 'result tree > fragment'. > > You should then be able to test with it as in: > > <xsl:template match="VENDOR_ITEM_NUM"> > <tr> > <td></td> > <td> > <font size="2"> > <xsl:if test="normalize-space(.) != $empty_string"> > <xsl:value-of select="concat('Vendor Item number: ',.)"/> > </xsl:if> > </font> > </td> > </tr> > </xsl:template> > > but don't forget to normalize-space() the content of the element, just to > get rid of any whitespace that might be lurking around. > > I hope that this helps, > > Jeni > > Jeni Tennison > http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: Using xsl:if to determine if a , Diamond, Jason | Thread | RE: Using xsl:if to determine if a , Kay Michael |
Re: space replaced with %20, David Carlisle | Date | RE: format-number in XT, Heather Lindsay |
Month |