Forum Moderators: open

Message Too Old, No Replies

Recognize nested element in xslt

Check if an element has a same-name parent

         

MalibuMan

3:22 pm on Feb 9, 2005 (gmt 0)



Hi,

After our DTD guys simplified our DTD to change steps and substeps into nested steps, I now have the dificulty of inserting an <ol> when a step is nested (in fact a substep).

XML:


<step>Do the following:
<step>Select: Start</step>
<step>Select: Yes</step>
</step>

XSLT so far (unsuccessful): I tried with xsl:if to see if the parent (..) equals the element 'step', so a match on step with parent step gets extra <ol> in front.


<xsl:template match="step">
<xsl:if test="..='step'">
insert ol if first and /ol if last (no problem here)
</xsl:if>
</xsl:template>

I considered doing two templates for step and step/step, but fear nested steps will be processed twice or three times.

I'm using WinXP and XMLspy to create the XSLT. And Solaris and Perl + Sablotron as a production system.

Someone must have had and solved this same problem... Apparently I googled for the wrong search terms.

Thanks,

MalibuMan

choster

8:37 am on Feb 21, 2005 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Wouldn't <xsl:if test="..='step'"> test that the content of the parent element is equal to step, rather than the name? There is probably a way to test on the name() of the parent node.

I haven't been able to test this (pretty late in this time zone), but I wonder if it might be better to work in the opposite direction, using recursion, if you get the idea:

<xsl:template match="instructions">
<ol>
<!-- process all steps which are children of the root -->
<xsl:apply-templates match="step" />
</ol>
</xsl:template>

<xsl:template match="step">
<li><xsl:value-of select="text()"/>

<!-- if this step has children , do it all over again -->
<xsl:if test="boolean(step)">
<ol>
<xsl:apply-templates />
</ol>
</xsl:if>
</li>
</xsl:template>