|
Subject: Re: Replacement for "first-of-type", etc. From: James Clark <jjc@xxxxxxxxxx> Date: Mon, 26 Apr 1999 08:42:21 +0700 |
You would have to do either:
<xsl:template match="bold[last()=1]|emph[last()=1]|...">
...
</xsl:template>
or
<xsl:template match="*">
<xsl:variable name="cur" expr="."/>
<xsl:choose>
<xsl:when test="count(../*[namespace(.)=namespace($cur)
and local-part(.)=local-part($cur)])=1">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose
</xsl:template>
I am having a hard time thinking of a real-life problem where I would
need to do this. Do you have one?
Michel Goossens wrote:
>
> I would like to select all child element types that occur only once.
> In the previous draft I wrote something like
> <xsl-template match="*[first-of-type() and last-of-type()]">
> ...
>
> But I do not see an evident replacement in the current (April 22) draft.
>
> Here is an example:
>
> Consider the following XML file:
>
> <article>
> <title>This is the article's title</title>
> <author>Author One</author>
> <author>Author Two</author>
> <abstract>A <emph>short</emph> description of the contents</abstract>
> <section>
> <stitle>First section title</stitle>
> <par>The first paragraph for this section.</par>
> <par>A paragraph with <emph>emphasised</emph> text.</par>
> <par>This is the end of the section.</par>
> </section>
> <section>
> <stitle>Second section title</stitle>
> <par>This is <emph>emph</emph> and <emph>more emph</emph> text.</par>
> <par>Paragraph with <bold>bold</bold> and
> <emph>emphasised</emph> text.</par>
> </section>
> </article>
>
> with the following XSL stylesheet:
>
> <?xml version='1.0'?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
> <xsl:template match="/">
> <xsl:text>(*root*)</xsl:text>
> <xsl:apply-templates/>
> <xsl:text>(/*root*)</xsl:text>
> </xsl:template>
> <xsl:template match="*" priority="-1">
> <xsl:text>(*)</xsl:text>
> <xsl:apply-templates/>
> <xsl:text>(/*)</xsl:text>
> </xsl:template>
> <xsl:template match="*[position()=1 and position()=last()]" priority="1">
> <xsl:text>($)</xsl:text>
> <xsl:apply-templates/>
> <xsl:text>(/$)</xsl:text>
> </xsl:template>
> </xsl:stylesheet>
>
> Then I obtain with xt the following output (which is correct):
>
> (*root*)($)
> (*)This is the article's title(/*)
> (*)Author One(/*)
> (*)Author Two(/*)
> (*)A ($)short(/$) description of the contents(/*)
> (*)
> (*)First section title(/*)
> (*)The first paragraph for this section.(/*)
> (*)A paragraph with ($)emphasised(/$) text.(/*)
> (*)This is the end of the section.(/*)
> (/*)
> (*)
> (*)Second section title(/*)
> (*)This is (*)emph(/*) and (*)more emph(/*) text.(/*)
> (*)Paragraph with (*)bold(/*) and
> (*)emphasised(/*) text.(/*)
> (/*)
> (/$)
>
> But I would like to select the <title>, <abstract>, and <stitle>
> elements, plus the <bold> and <emph> elements in the last <par> element
> since they are unique child elements of their respective types for the
> parent node. I tried to understand how to work with the preceding and
> following-sibling axes, but the syntax I should use escapes me.
> Can somebody explain how I could express my match pattern? Thanks. m
>
> ----------------------------------------------------
> Dr. Michel Goossens Phone: (+41 22) 767-5028
> IT Division Fax: (+41 22) 767-8630
> CERN Email: goossens@xxxxxxx
> CH-1211 Geneva 23 F-01631 CERN Cedex
> Switzerland France
>
> 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 -> |
|---|---|---|
| Replacement for "first-of-type", et, Michel Goossens | Thread | Latin 1 characters in XSLT with lat, Michel Goossens |
| Re: Formatting Objects considered h, James Clark | Date | Announcement: XML/SGML Asia Pacifc , Marcus Carr |
| Month |