OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]
Re: [xml-dev] XSLT stylesheet looping through the same node (recursion?)

Hi Michael,


Below is the output from your helpful suggestion:

( 1 ) <area>

( 2 ) <interest>Tennis</interest>

( 3 ) <interest>Movie</interest>

( 4 ) <interest>Swimming</interest>

( 5 ) </area>


( a ) <xsl:stylesheet version="1.0"
( b ) xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
( c ) xmlns:ns="http://www.w3.org/1999/xhtml"
( d ) exclude-result-prefixes="ns">
( e )
( f ) <xsl:template match="/">

( g )<area>

( h )<xsl:apply-templates select="//ns:p"/>

( i ) </area>

( j )</xsl:template>

( k )<xsl:template match="ns:p[ns:strong='Nearest Hotels:']">

( l ) <xsl:for-each select="text()[normalize-space() != '']">

( m )<nearest_hotels><xsl:value-of select="normalize-space()"/></nearest_hotels>

( n ) </xsl:for-each>

( o ) </xsl:template>

( p )<xsl:template match="ns:p"/>

( q )

( r )</xsl:stylesheet>


This is the closest thing to what I wanted except that I would it to co-exist with the existing working XSL statements:


( i ) I could not getting another list of element values (e.g. favourite songs...) that comes immediately after the <Interest> element. This may be due to the context node having been changed by when running the aboved stylesheet.

( ii ) There are other element values that I need to retrieve from the same document, where some is made up of a single value while others may have multiple occurrences. I will need to some how include the aboved code segment into the following existing working stylesheet responsible for retrieving other single element values, using the current context node where possible:


<xsl:template match="/">


<xsl:for-each select="/ns:html/ns:body/ns:div[@id='content']/ns:p/ns:strong">

<xsl:if test="contains(.,'Firstname:')">


<xsl:when test="contains(.,'Firstname:')">

<firstname><xsl:value-of select="../ns:a"/></firstname>







<xsl:if test="contains(.,'Surname:')">


<xsl:when test="contains(.,'Surname:')">

<surname><xsl:value-of select="../text()"/></surname>








Thank you so much for the on-going guidances,


From: Michael Kay <mike@saxonica.com>
To: Jack Bush <netbeansfan@yahoo.com.au>; xml-dev@lists.xml.org
Sent: Tuesday, 27 January, 2009 12:54:23 AM
Subject: RE: [xml-dev] XSLT stylesheet looping through the same node (recursion?)

It looks to me as if you would be better off using pattern matching

<xsl:template match="/">


    <xsl:apply-templates select="//p"/>



<xsl:template match="ns:p[ns:strong='Interest:']">
  <xsl:for-each select="text()[normalize-space() != '']">
    <interest><xsl:value-of select="normalize-space()"/></interest>
<xsl:template match="ns:p"/>
Michael Kay

From: Jack Bush [mailto:netbeansfan@yahoo.com.au]
Sent: 26 January 2009 13:31
To: xml-dev@lists.xml.org
Subject: [xml-dev] XSLT stylesheet looping through the same node (recursion?)

Hi All,


I would like to get all the content/text in <p> node from the XML document where <p> has a child node <strong>Interest:<strong>. Below is the listing of both XML document and XSLT stylesheet:


  <?xml version="1.0" encoding="UTF-8" ?>

  <!DOCTYPE html (View Source for full doctype...)>

- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml">

- <head>

- <body


- ><div id="container">

+ <div id="header">

  <div id="postmark" />

- <div id="content">

+ <div id="as1">


  <h1>Employee Detail</h1>

- <p>


  <br  />


  <br  />


<br  />


<br  />





<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"






<xsl:template match="/">


- <xsl:for-each select="/ns:html/ns:body/ns:div[@id='content']/ns:p/ns:strong">

- <xsl:if test="contains(.,'Interest:')">

- <xsl:choose>

- <xsl:when test="contains(.,'Interest:')">

- <interest>

  <xsl:value-of select="../text()" />



- <xsl:otherwise>










The transformation process produces the following output:


<?xml version="1.0" encoding="UTF-8"?>

<html xmlns="http://www.w3.org/1999/xhtml">

  <title>Employee Detail</title>


      <h1>Employee Detail</h1>






One possible solution is by using recursion to go through the list of values on nodes but I am cannot think of how this could be done. Perhaps my difficulty is that I don’t know how to navigate down the list of interest of the same node using xsl command. Most of the Googled articles consisted of searching for the same type of element a cross multiple nodes, where as I am looking all the values (same type anyway) in a single node.


Below is the JDOM XPath solution to get the same list of values:


XPath interestxpath = XPath.newInstance("/ns:html/ns:body/ns:div[@id='content']/ns:p[10]/node()");

interestxpath.addNamespace("ns", "http://www.w3.org/1999/xhtml");

java.util.List interest_list =                       interestxpath.selectNodes(employeejdomDocument);

Iterator interest_iterator = interest_list.iterator();

while (interest_iterator..hasNext())


   interest_value = ((org.jdom.Content)interest_iterator.next()).getValue();



I am new to XSLT stylesheet transformation and can do with some guidances.


Many thanks again,



Stay connected to the people that matter most with a smarter inbox. Take a look.

Stay connected to the people that matter most with a smarter inbox. Take a look.

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 1993-2007 XML.org. This site is hosted by OASIS