RE: [xsl] <xsl:for-each> not working...

Subject: RE: [xsl] <xsl:for-each> not working...
From: "John Liebermann" <ahsan_hussain@xxxxxxxxxxxxx>
Date: Fri, 15 Aug 2003 14:19:05 -0700
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@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of David
Carlisle
Sent: Tuesday, July 15, 2003 1:27 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
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


Current Thread