This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: xsl value-of
- From: "Matias Woloski" <woloski at sion dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Tue, 2 Apr 2002 15:49:19 -0300
- Subject: RE: [xsl] xsl value-of
- Reply-to: xsl-list at lists dot mulberrytech dot com
Jeni and Joerg, thank you very much for your help.
It finally worked!
I've used
<xsl:key name="labels" match="label" use="concat(../../@id, '_', @id)"/>
I didn't understand why I have to put only label and not label/text()
thanks again,
Matias
> -----Original Message-----
> From: Jeni Tennison [mailto:jeni@jenitennison.com]
> Sent: martes, 02 de abril de 2002 15:32
> To: Matias Woloski
> Cc: xsl-list@lists.mulberrytech.com
> Subject: Re: [xsl] xsl value-of
>
>
> Hi Matias,
>
> > I created a key in the top of the document
> >
> > <xsl:key name="labels" match="xml/group/questionAnswered/label/text()"
> > use="concat(xml/group/@id, '_',
> xml/group/questionAnswered/label/@id)" />
>
> Hmm... OK, this is the problem.
>
> Keys build up named tables of nodes and values which enable you to
> quickly get at a set of nodes that are associated with a particular
> value.
>
> When an XSLT processor builds up one of these tables, it goes through
> the document and finds all the nodes that match the pattern held in
> the match attribute. With your definition, a processor would locate
> all the text nodes in the document that are children of a label
> element that is a child of a questionAnswered element that is a child
> of a group element that is a child of an xml element.
>
> (By the way 'xml' is an illegal name for an element -- XML parsers
> should object to you using it.)
>
> When it finds a matching node, the XSLT processor evaluates the
> expression held in the use attribute to create a value for the node,
> by which the node is indexed. When it evaluates this expression, it
> uses the node that it's indexing as the current node -- so any
> relative paths are evaluated relative to the matched node.
>
> In your case, the expression is:
>
> concat(xml/group/@id, '_', xml/group/questionAnswered/label/@id)
>
> The current node is a text node under a label element. You're asking
> the processor to concatenate the id of the group element of the xml
> element *child* of the *text node* with an underscore and the id of
> the label element of the ... of the xml element *child* of the *text
> node*. Text nodes don't have children, so these paths are doomed to
> failure.
>
> What you're trying to do is index the text node by the id of the text
> node's *ancestor* group element, concatenated with an underscore and
> the id of the text node's *parent* label element. So what you need is:
>
> <xsl:key name="labels" match="xml/group/questionAnswered/label/text()"
> use="concat(ancestor::group/@id, '_', parent::label/@id)" />
>
> Personally, since the label element doesn't hold mixed content, and
> since the label elements don't occur anywhere aside from within
> questionAnswered elements that are children of group elements that are
> children of xml elements, I'd use the definition:
>
> <xsl:key name="labels" match="label"
> use="concat(ancestor::group/@id, '_', @id)" />
>
> The fact that the label elements don't contain mixed content means
> that getting the value of a label element gives you exactly the same
> as getting the value of the label element's text node child. The fact
> that you're interested in all label elements means that there's no
> need to add all that checking of ancestor elements to the match
> pattern -- not having to check that the label element is a child of
> questionAnswered and so on will save the processor a little bit of
> work. The definition looks easier, too!
>
> The rest of the code should work fine.
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list