Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


Re: [xsl] numbering output and other newbie issues

From: "Jon Gorman" <jonathan.gorman@--------->
To:
Date: 3/1/2006 2:59:00 PM
> This gives me something close to the solution I am looking for.
> However, some of my answers have text that I have tagged with
> <us></us> for underscore like this:
>
> <item> 1. Millions of Americans <answer><us>watch</us> displays of
> fireworks on the
>              Fourth of July.</answer>
>
> I would like those tags to appear in the output. I have tried
> <xsl:copy-of select "us" /> in several positions, but the output
> doesn't change.

Probably because you're putting it somewhere that it is never actually
reached.

Have you tried
<xsl:template match="us">
<xsl:copy-of select="." />
</xsl:template>?


> I am puzzled by the several random returns left in the output as in
> answers 8 and 9. But I am feeling good about the script. Here is my
> understanding of what I am doing in each section.
> First I am stripping out white spaces from every element (or trying to!).

The source XML had those return lines.  White-space striping removes
text nodes that only contain whitespace, not necessarily any
whitespace within the node.  See http://www.w3.org/TR/xslt#strip


> Then I am selecting NameLine, Item, definitions, and directions.

I think there's some confusion here.  You're not "selecting" these
anywhere.  Templates tells you what should happen when you do select
elements.  You select elements by <xsl:apply-templates select="foo"
/>.
Remember there are default templates as well.



I
> I don't understand
> why I am selecting item. I will try commenting out that line to see
> if it changes the output.

As far as I can tell, you don't ever directly select item.  What
you're doing is saying "When in processing an apply-templates is
called and the node matches this template the best, produce this
output".


> Then I am selecting topic, adding a return before it and two returns
> after it. The apply-templates passes all this topic to output--is
> that right?  If not to output, then it goes on...to the next template?

Your mental model seems a bit wonky here.

> I think I got the aha you spoke of. That is, that when you match a
> node, you are removing it (perhaps to a processing cache of some
> kind). If you don't do anything with that node, then it remains in
> process until you call it out, so to speak. If you don't call it it
> out, it goes away to some cyber graveyard.

Not really.  It's more accurate to say that you are saying to print
nothing.  In another language imagine:

void foo(obj object) {}

You can call foo all you like, it just doesn't do anything.

>
> Am I getting close to a clearer understanding of the basic process?

Hard to tell, I've only skimmed this thread but you still seem to be
guessing your way through it.


The first thing to realize is that there are default templates: see
http://www.w3.org/TR/xslt#built-in-rule.

or in short:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>



I'd recommend the following exercise.  Add the default templates to
your stylesheet to make it easier to do this.  Print out your
stylesheet, get a blank piece of paper.  Now look at your XML
document.

We start at the / node, which contains the child element Story.  Find
which xsl:template match="." expression seems the most specific match
for the / node.  Follow the instructions in that node.  Remember that
without a select attribute xsl:apply-templates will look for templates
that apply for all child element nodes and child text nodes.  It won't
apply to attributes though, so be careful about that.

In this case, the built-in template that matches the best is
<xsl:template match="*|/">
<xsl:apply-templates />
</xsl:template>

So we apply-templates to all the children, which in this case is
Story.  We again look for the best match.

<xsl:template match="*|/">
<xsl:apply-templates />
</xsl:template>

I'll leave it as an exercise for you to finish the rest of this
processing.  In the end what you get on the sheet should match your
output here, except probably for some spacing issues.  Hopefully
you'll get a better understanding of the process though.


Jon Gorman


transparent
Print
Mail
Like It
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent