|
Subject: [xsl] Answers to review questions in "Beginning XSLT": Chapter 5 From: "Lars Huttar" <lars_huttar@xxxxxxx> Date: Tue, 11 Mar 2003 12:24:00 -0600 |
OK, here are my answers for review questions from Chapter 5.
Intermingled are questions that I still have. If you have comments,
I'd be grateful for the feedback.
For now I'm omitting the questions themselves, since I don't yet have
explicit permission to copy them. (Jeni, would that be OK?)
Answers:
1. No nodes match the select pattern, so no templates get applied,
so there is no output for that apply-templates.
2. Use one template with match="Description//Film", and another with
match="Channel/Film". Or use match="Film" for one of them, and
the more specific match for the other.
3. This code produces a <div> element with contents as follows:
if there are Film children of the current node, they are processed
with xsl:apply-templates; otherwise, the message "No films..."
is included.
4. Rewriting of preceding code using <xsl:choose> instead of <xsl:if>:
<div>
<xsl:choose>
<xsl:when test="Film">
<xsl:apply-templates select="Film" />
</xsl:when>
<xsl:otherwise>
No films showing on this channel.
</xsl:otherwise>
</xsl:choose>
</div>
The advantage of the latter form is that if there are no Film
children of the current node, <xsl:apply-templates> doesn't get
evaluated. Also, it may be a little more clear to the human reader
that there are two mutually exclusive possibilities for the <div>
elements contents: the results of applying templates to "Film" children,
and the "No films..." message.
The advantage of the <xsl:if> form is that it is shorter, and for
that reason perhaps easier to read.
5. The given code inserts a 20x20 icon iff there is a flag attribute
on the current node. There is a specific icon for when the value
of the flag attribute is 'favorite', and another for when it is
'interesting', and a third for any other value. If the flag attribute
doesn't exist, no icon is inserted.
6. Rewriting of the above "as a sequence of <xsl:if> elements" instead of
using <xsl:choose>: (One could take "sequence" to mean "no nesting",
but that would hobble the <xsl:if> and I don't think that was the
intent of the question, so I'm going to nest them.)
<xsl:if test="@flag">
<xsl:if test="@flag = 'favorite'">
<img src="favorite.gif" alt="[Favorite]" width="20" height="20" />
</xsl:if>
<xsl:if test="@flag = 'interesting'">
<img src="interest.gif" alt="[Interest]" width="20" height="20" />
</xsl:if>
<xsl:if test="@flag != 'favorite' and @flag != 'interesting'">
<img src="flag.gif" alt="[Flagged]" width="20" height="20" />
</xsl:if>
</xsl:if>
The disadvantage of the <xsl:if> form is that if the flag attribute
exists, all three of the inner tests must be evaluated; whereas
in an <xsl:choose> element, when one test succeeds, the following
ones are ignored. Thus there is no need to repeat the comparisons
against 'favorite' and 'interesting'.
The advantage of the <xsl:if> form is that it is shorter. In this
case I've wrapped the comparisons of the value of @flag within a
test for the flag attribute's existence, thus saving work if the
attribute doesn't exist. This could also be done with a nested
<xsl:choose>, but would be more bulky because it would require
two nested elements, <xsl:choose> and <xsl:when>, as opposed to one
<xsl:if>.
7. test="Film/@year > 1950"
8. Film[starts-with(Title, 'Romeo')]
9. test="number()"
This converts the current node's value to a number, which is then
converted to true if non-zero, false if zero or NaN.
10. To test whether the current node's value is a number,
use test="number() or number() = 0" which gives the desired result.
Is there a simpler way?
I tried test="number() != NaN" but this was always false (Why? Is
NaN not recognized as the numeric constant? No, I just learned that
it's because NaN is not equal to itself! See the FAQ,
http://www.dpawson.co.uk/xsl/sect2/N5846.html);
test="number() != 'NaN'" was always true;
test="number() != number('NaN')" also was always true (see above,
NaN is not equal to itself);
test="string(number()) != 'NaN'" worked but this is not necessarily
simpler. (Btw I see from the FAQ that this is a standard way
to check whether a node's value is a number. There Jeni Tennison
also suggests test="@value <= 0 or @value > 0" or
test="number(@value) = number(@value)". However, these both rely
on properties of NaN that are not covered in ch. 5.)
Question: is there a way to represent the numeric constant NaN
in an expression? Apparently the unquoted NaN is not recognized
as such; I guess it's interpreted as "the value of the child element
named NaN."
OK, that's chapter 5. Thanks for your time and attention.
Feedback is appreciated.
Lars
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of
> Jeni Tennison
> Sent: Tuesday, March 11, 2003 5:16 AM
> To: Lars Huttar
> Cc: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Answers to review questions in "Beginning XSLT"?
>
>
> Hi Lars,
>
> >I've been working through Jeni Tennison's book, "Beginning XSLT". As
> >I answer the review questions at the end of each chapter, it would be
> >comforting to compare them with someone else's to make sure I hadn't
> >missed something important.
> >
> >Does anybody have a collection of answers they've put together that
> >they'd be willing to share?
> >
> >Anyone know of a forum or a web site anywhere where these answers are
> >posted and discussed? Seems like it would be a useful thing to have.
>
> I think that you should feel free to post here, especially if there
> are questions that you're not sure about or want to discuss the answer
> to. Or there's the XSLT list on the p2p.wrox.com site; it looks like
> Mike Kay answers a lot of queries there.
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
>
> 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 |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Answers to review questio, Jeni Tennison | Thread | RE: [xsl] Answers to review questio, Lars Huttar |
| [xsl] Dynamic evaluation of XPath, Yue Ma | Date | [xsl] Re: XSL-List Digest V4 #1143, Brook Ellingwood |
| Month |