xsl-list
[Top] [All Lists]

RE: restructuring element hierarchy using xslt

2003-09-29 10:17:24
The normal <xsl:apply-templates/> processes the children in the XML
tree. All that you need is an <xsl:apply-templates that processes the
children in the logical tree.

Start by processing the top level elements:

<xsl:apply-templates select="het[string-length(@position)=1]"/>

And when you process a <het> element, process it's logical children.
These are the nodes whose @position (a) starts with the @position of the
current node, and (b) contain one more "." than the @position of the
current node:

<xsl:template match="het">
<xsl:copy>
  <xsl:apply-templates select="following-sibling::het[
     starts-with(@position, current()/@position) and
     number-of-dots(@position) =
number-of-dots(current()/@position)+1]"/>
</xsl:copy>
</xsl:template>

Here number-of-dots(X) should be expanded as:

string-length(X) - string-length(translate(X, '.', ''))

Untested.

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
james walker
Sent: 29 September 2003 13:00
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] restructuring element hierarchy using xslt


I have an xml document like this:

<het position="1"></het>
<het position="1.1"></het>
<het position="1.1.1"></het>
<het position="1.1.2"></het>
<het position="1.2"></het>
<het position="1.2.1"></het>
<het position="2"></het>
<het position="2.1"></het>
<het position="2.1.1"></het>

and i was trying to get it to look like this:

<het position="1">
      <het position="1.1">
              <het position="1.1.1">
              </het>
              <het position="1.1.2">
              </het>
      </het>
      <het position="1.2">
              <het position="1.2.1">
              </het>
      </het>
</het>
<het position="2">
      <het position="2.1">
              <het position="2.1.1">
              </het>
      </het>
</het>

In other words make it nested. I can get the first set of  
elements out by 
doing a contains() function in a predicate (<xsl:template 
match="het[contains(@position, '.')=false]">) but i am having 
a problem with 
template matching, i know i can't put a template match within 
a template 
match and this is causing me a bit of trouble.

_________________________________________________________________
Get Hotmail on your mobile phone http://www.msn.co.uk/msnmobile


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



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



<Prev in Thread] Current Thread [Next in Thread>