XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
N TSubject: Help with retrieving inner node text
Author: N T
Date: 08 Sep 2005 02:29 PM
Hello, I am trying to write an XSL for the following XML data:

<NEWS>
<ITEM id="1">
<BODY>
<SECTION TYPE="Content">
<PARA>Some text content <innernode att="ABC"/> Some more text</PARA>
<PARA>Some text content. No innernode. Some more text</PARA>
</SECTION>
</BODY>
</ITEM>
<ITEM id="2">
<BODY>
<SECTION TYPE="Content">
<PARA>Some text content Some more text <innernode att="XYZ"/> other text</PARA>
<PARA>Some text content. No innernode. <innernode2/> Some more text</PARA>
</SECTION>
</BODY>
</ITEM>
</NEWS>

Basically, I need to display PARA text as is, but need to replace innernode based on the attribute att with some text. Example of innernode being a anchor tag with href as attribute and I need to replace that with a regular "a" tag. I need to also delete innernode2 from displaying.

Also, I had to jump through hoops in the XSL to get to the ITEM that needs to be displayed. The id of the item is passed as a param and need to display the article based on that.

Here's what I came up with so far, but isn't working:
1) It isn't replacing the innernode tag in-line.
2) There must be a better way to do this like calling apply-templates and replacing innernode and eliminating innernode2. I am not able to come up with it though.
Any help is greatly appreciated.

<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:param name="articlekey">1</xsl:param>
<xsl:variable name="article" select="/NEWS/ITEM[@id=$articlekey]"/>

<xsl:template match="/">
<xsl:if test="$article/@id = $articlekey">
<table border="0" cellpadding="0" cellspacing="0" width="100%">

<xsl:call-template name="articleBody"/>

</table>
</xsl:if>
</xsl:template>

<xsl:template name="articleBody" match="/NEWS/ITEM/BODY">
<tr><td width="100%">

<xsl:for-each select="$article/BODY/SECTION[@TYPE='Content']/PARA">
<xsl:value-of select="."/><hr/>
<xsl:for-each select="./innernode">
(<xsl:value-of select="./@att"/>)
</xsl:for-each>
</xsl:for-each>
</td></tr>

</xsl:template>

Postnext
Tony LavinioSubject: Help with retrieving inner node text
Author: Tony Lavinio
Date: 16 Sep 2005 05:33 PM
Sorry for the delay; this should do what you want.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="US-ASCII" indent="yes"/>
<xsl:param name="article" select="'1'"/>
<xsl:template match="/">
<xsl:apply-templates select="NEWS/ITEM[@id = $article]"/>
</xsl:template>
<xsl:template match="node()">
<xsl:element name="{local-name(.)}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="child::*"/>
</xsl:element>
</xsl:template>
<xsl:template match="innernode">
<xsl:if test="@att = 'ABC'">
<new-abc-node/>
</xsl:if>
<xsl:if test="@att = 'XYZ'">
<new-xyz-node/>
</xsl:if>
</xsl:template>
<xsl:template match="innernode2"/>
</xsl:stylesheet>

Postnext
N TSubject: Help with retrieving inner node text
Author: N T
Date: 21 Sep 2005 04:13 PM
Thanks a lot Tony. This does get me in the right direction. However, I have a small problem.
The following code:
<xsl:template match="node()">
<xsl:element name="{local-name(.)}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="child::*"/>
</xsl:element>
</xsl:template>
<xsl:template match="innernode">
<xsl:if test="@att = 'ABC'">
<new-abc-node/>
</xsl:if>
<xsl:if test="@att = 'XYZ'">
<new-xyz-node/>
</xsl:if>
</xsl:template>

does not work as I expect. I mean, for the following PARA tag,
<PARA>Some text content <innernode att="ABC"/> Some more text</PARA>,
it prints
<PARA>Para 1 Some text content Some more text
<new-abc-node/>
</PARA>

But I need the text to be inline, meaning the new-abc-node needs to be positioned between the 2 text nodes. This is what I expect
<PARA>Para 1 Some text content <new-abc-node/> Some more text
</PARA>

Any help will be appreciated.
thanks.

Posttop
Tony LavinioSubject: Help with retrieving inner node text
Author: Tony Lavinio
Date: 26 Sep 2005 04:16 PM
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="US-ASCII" indent="yes"/>
<xsl:param name="article" select="'2'"/>
<xsl:template match="/">
<NEWS>
<xsl:apply-templates select="NEWS/ITEM[@id = $article or $article = '']"/>
</NEWS>
</xsl:template>
<xsl:template match="ITEM|BODY|SECTION">
<!-- <xsl:element name="{local-name(.)}"> -->
<xsl:apply-templates select="*"/>
<!-- /xsl:element> -->
</xsl:template>
<xsl:template match="PARA">
<PARA>
<xsl:apply-templates select="node()"/>
</PARA>
</xsl:template>
<xsl:template match="innernode">
<xsl:if test="@att = 'ABC'">
<new-abc-node/>
</xsl:if>
<xsl:if test="@att = 'XYZ'">
<new-xyz-node/>
</xsl:if>
</xsl:template>
<xsl:template match="innernode2"/>
</xsl:stylesheet>

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.