Re: [xsl] Getting variable yet most immediate parentNode

Subject: Re: [xsl] Getting variable yet most immediate parentNode
From: Steve <subsume@xxxxxxxxx>
Date: Fri, 28 Sep 2007 11:56:43 -0400
Here are my templates, once again commented and updated with some of
the advice here.

<xsl:template match="section">
	<fieldset class="oneCol" id="{@key}">
		<legend><span><xsl:value-of select="@name" /></span></legend>
			<xsl:apply-templates select="questions" />
	</fieldset>
</xsl:template>
<xsl:template match="questions">
	<xsl:apply-templates select="option" />
	<xsl:if test="following-sibling::questions">
		<hr />
	</xsl:if>
</xsl:template>
<xsl:template match="answers[option]">
	<xsl:param name="value" />
	<select name="value">
		<option>Select one</option>
		<xsl:apply-templates select="option" >
			<xsl:with-param name="value" select="$value" />
		</xsl:apply-templates>
	</select>
	<span class="print">
		<xsl:value-of select="$value"/>
	</span>
</xsl:template>
<xsl:template match="option[name(..) = 'questions']">
	<div>
		<span class="two">
			<input type="hidden" name="section" value="{../../@key}" />
			<input type="hidden" name="questionKey" value="{@key}" />
			<label>
                                <!-- Doesn't work. Ignores all @name -->
				<xsl:value-of select="(@name|.)[1]" />
			</label>
		</span>
		<xsl:variable name="v" select="$R[section=current()/../../@key and
questionKey=current()/@key]/value" />

               <!-- This is only slightly better than the previous
version. Case statements still seem necessary, because i want either
the child, and failing that the nearest ancestor -->

		<xsl:choose>
			<xsl:when test="answers">
				<xsl:apply-templates select="answers">
					<xsl:with-param name="value" select="$v" />
				</xsl:apply-templates>
			</xsl:when>
			<xsl:otherwise>
				<xsl:apply-templates select="ancestor::*[answers][1]/answers">
					<xsl:with-param name="value" select="$v" />
				</xsl:apply-templates>
			</xsl:otherwise>
		</xsl:choose>
	</div>
</xsl:template>
<xsl:template match="option[name(..) = 'answers']">
	<xsl:param name="value" />
	<option>
		<xsl:if test="$value=(@name|.|@value)">
			<xsl:attribute name="selected">selected</xsl:attribute>
		</xsl:if>
		<xsl:attribute name="value">
                        <!-- much like value-of select="(@name|.)[1]"
above. Except since that didn't work there's no sense applying it
here, too -->
			<xsl:choose>
				<xsl:when test="@value"><xsl:value-of select="@value" /></xsl:when>
				<xsl:otherwise><xsl:value-of select="." /></xsl:otherwise>
			</xsl:choose>
		</xsl:attribute>
		<xsl:value-of select="." />
	</option>
</xsl:template>		

On 9/28/07, Steve <subsume@xxxxxxxxx> wrote:
> >Abel Braaksma <abel.online@xxxxxxxxx> wrote:
> > which means that <xsl:template match="option" mode="q">... will never be
> > triggered by this snippet:
> >
> >     <xsl:template match="questions">
> >         <xsl:apply-templates mode="q" select="option" />
> >         <SNIP />
> >     </xsl:template>
>
> Yep, that's my fault. Questions do have option children. My mistake.
>
> > Steve, if you rewrite statements like that as this one above as:
> >
> >     <xsl:template match="answers[option]">
> >        ....
>
> Ahh, yes. Wise and simple, thank you. Done.
>
> >
> > Wendell, considering the possible intent of Steve to wrap all output
> > inside one <div>, it is probably better if he does go back to using the
> > // syntax, but not in the way I proposed, but more like this (assuming
>
> I think we've gone awry. .//answer's doesn't make sense because, as
> Wendell pointed out, I want to go up the tree if there is no child
> <answers />. I tried his syntax, however I'm not sure how to make it
> choose a child answer's node before it goes looking for the closest
> ancestral answer node (without using those pesky case statements).
>
>
> > <xsl:template match="option">
> >     <option><xsl:value-of select="(@name | .)[1]" />
> > </xsl:template>
>
> And finally, this last shortcut doesn't function. My logic is "If it
> has a @name, use it, otherwise just use the node's text." I'm honestly
> not sure how to interpret this shortcut because the "|" seems to imply
> union, which of course doesn't seem to fit my intentions. At any rate,
> this statement never spits out question <option>s with @name.
>
> I'm assuming much of the confusion over what I am attempting is my
> fault, and particularly my pasting a slightly incomplete source XML.
> Here is an actual example.
>
> <root>
>                 <section key="D" name="Nutritional status">
>                         <questions>
>                                 <option key="A" name="Does client have prescribed diet by physician?" />
>                                 <option key="C" name="Do you have a good appetite?" />
>                                 <option key="K" name="Daily fluid intake per cups?">
>                                         <answers>
>                                                 <option p="1">1</option>
>                                                 <option p="2">2</option>
>                                                 <option p="3">3</option>
>                                                 <option p="4">4</option>
>                                                 <option p="5">5</option>
>                                         </answers>
>                                 </option>
>                                 <option key="J" name="Weight">
>                                         <answers>
>                                                 <option p="1">Underweight</option>
>                                                 <option p="2">Overweight</option>
>                                                 <option p="0">Normal</option>
>                                         </answers>
>                                 </option>
>                                 <option key="L" name="Taking vitamin/mineral supplements?" />
>                         </questions>
>                         <questions>
>                                 <answers>
>                                         <option p="1">5</option>
>                                         <option p="2">1</option>
>                                         <option p="3">1.5</option>
>                                         <option p="4">2</option>
>                                         <option p="5">3</option>
>                                         <option p="6">4 or more</option>
>                                 </answers>
>                                 <option key="D" value="POULTRY">Servings of meat, fish, eggs,
> dried peas, beans and nuts</option>
>                                 <option key="E" value="FRUIT">Servings of citrus fruit, juices and
> tomatoes</option>
>                                 <option key="F" value="GREENVEG">Servings of dark green, leafy
> vegetables</option>
>                                 <option key="G" value="VEG">Servings of other fruits, vegetables
> and juices</option>
>                                 <option key="H" value="STARCH">Servings of bread, cerea, rice,
> pasta</option>
>                                 <option key="I" value="DAIRY">Servings of dairy products</option>
>                                 <option key="J" value="MISC">Servings of Misc. foods</option>
>                         </questions>
>                 </section>
> </root>

Current Thread