Sir, your recommended piece of code doesn't do much different from what my
code was doing. I want the heading "Output Descriptions" to be displayed
only once before the fields under the output parent are displayed. Here is a
snippet of the input XML:
<HSDataContainerType list="true" name="Outputs" required="true" revision=""
systype="true">
<HSDataContainerType name="NoValueRestrictions" required="true"
revision="">
<HSString name="required" required="true" xmlNodeType="1" />
<HSString name="optional_NoDefault" xmlNodeType="1">
<DefaultValue />
</HSString>
<HSString name="optional_withDefault" xmlNodeType="1">
<DefaultValue>This is the default value</DefaultValue>
</HSString>
</HSDataContainerType>
<HSDataContainerType name="TextValueRestrictions" required="true"
revision="">
<HSString name="restrictByValue" required="true"
restrictType="1"
xmlNodeType="1">
<restrictedValue>CA</restrictedValue>
<restrictedValue>WA</restrictedValue>
<restrictedValue>VA</restrictedValue>
</HSString>
<HSString name="restrictByRange" required="true"
restrictType="2"
xmlNodeType="1">
<restrictedValue>0</restrictedValue>
<restrictedValue>100</restrictedValue>
</HSString>
....
I think if i put the text "Output Descriptions" before the for-each loop, i
would be able to separate the Heading from the icons and the field heading.
So if i write my XSL like this:
<b>Output Description: </b><br /><br />
<img src="texticon.gif"><a name="{generate-id(.)}">
<b><xsl:comment>Accessing the parent nodes...</xsl:comment>
<xsl:for-each select="ancestor::*">
<xsl:choose>
<xsl:when test="contains(@name,
'Inputs')"></xsl:when>
<xsl:when test="contains(@name, 'Outputs') and
not(ancestor::*[contains(@name,'Outputs')])">
<!-- <xsl:when test="contains(@name,
'Outputs')"> -->
<a name="out"></a>
</xsl:when>
<xsl:when test="contains(@name,
'Settings')"></xsl:when>
<xsl:otherwise>
<xsl:if test="not(position()='1')">
<xsl:value-of select="@name" />/
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
But this doesn't solve the problem either since it puts "Output
Descriptions" above every field with the ancestor 'Output'. The reason for
this is that i am using certain templates which are called over and over
again. Is there a way to put it inside and display it only without the icon.
Thanks.
John
-----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
David
Carlisle
Sent: Tuesday, July 15, 2003 1:27 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] <xsl:for-each> not working...
it would have been easier if you'd shown the input but guessing..
change
<xsl:when test="contains(@name, 'Outputs')">
to
<xsl:when test="contains(@name, 'Outputs') and
not(ancestor::*[contains(@name,'Outputs')])">
so you only get the first such name (this will search the ancestor list
in quadratic time, but assuming your tree is only a few deep not
thousands that doesn't really matter)
I assume this is left over debuging
<xsl:if test="contains(@name,
'Outputs')"></xsl:if>
as it's always true (as it's inside an xsl:when with the same test) and
doesn't do anything.
David
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list