RE: [xsl] Fine tuning a template match

Subject: RE: [xsl] Fine tuning a template match
From: "Trevor Nicholls" <trevor@xxxxxxxxxxxxxxxxxx>
Date: Mon, 31 Jul 2006 17:15:08 +1200
Hi Jay

> If I understand correctly, you want to narrow the XRefs within tables.
> If so, could you add [ancestor::TABLE]:
> 
> <!-- hyperlink targets in rows -->
> <xsl:template match="A[ ancestor::TABLE ][ @ID ][
>      not(@CLASS='XRef') ][ not(ancestor::FOOTNOTES) ]">
> 
> That would ensure that this template matches only A elements
> that somewhere within tables.

I've tried this: the problem is that it still matches the A elements that
have already been matched by the moded template.

1. My various table templates call apply-templates on all A elements that
appear at any level within the "titles" (which is under CAPTION if the rows
are separate, or under CAPTION/TableTitleList if the rows are also under
CAPTION, or non-existent if this table has no CAPTION at all). This call to
apply-templates has a mode (tblhd).

2. Various templates (those inside rows, but also those inside "title"
elements) call apply-templates on their own child A elements. These calls to
apply-templates are modeless, but unfortunately they include all the A
elements that were processed by [1] as well.

Cheers
Trevor

-----Original Message-----
From: Jay Bryant [mailto:jay@xxxxxxxxxxxx] 
Sent: Monday, 31 July 2006 5:00 p.m.
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Fine tuning a template match

Hi, Trevor,

I sympathize, as I am doing FrameMaker-to-DocBook for my current client.

If I understand correctly, you want to narrow the XRefs within tables. If
so, could you add [ancstor::TABLE]:

<!-- hyperlink targets in rows -->
<xsl:template
match="A[ancestor::TABLE][@ID][not(@CLASS='XRef')][not(ancestor::FOOTNOTES)]
">

That would ensure that this template matches only A elements that somewhere
within tables.

Jay Bryant
Bryant Communication Services

----- Original Message ----- 
From: "Trevor Nicholls" <trevor@xxxxxxxxxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Sunday, July 30, 2006 10:56 PM
Subject: [xsl] Fine tuning a template match


> Hi
>
> I am trying to transform some FrameMaker-generated XML that contains lots
of
> tables. The tables optionally include a set of titles, and these titles
are
> usually wrapped in a caption element - but sometimes the caption element
> also includes all the table rows :-(
>
> Scattered "randomly" through the tables we have <A id=> elements and my
> requirement is to process all title-related <A> elements before the table,
> and all row-related <A> elements within their row. There are <A id=>
> elements elsewhere in the document, hence some of the conditions in the
> template which is designed to process them.
>
> The following extract successfully identifies the table types and the <A>
> elements to be processed at the head of the tables:
> ==============
> <!-- tables -->
> <!-- some tables have one caption child and multiple row children-->
> <xsl:template match="TABLE[CAPTION and ROW]">
> <xsl:apply-templates select="CAPTION//A[@ID]" mode="tblhd"/>
> <xsl:element name="table">...</xsl:element>
> </xsl:template>
>
> <!-- others have all the rows inside the caption -->
> <!-- in this case the title is wrapped in a titlelist -->
> <xsl:template match="TABLE[CAPTION/ROW]">
> <xsl:apply-templates select="CAPTION/TableTitleList//A[@ID]" mode="tblhd"
/>
> <xsl:element name="table">...</xsl:element>
> </xsl:template>
>
> <!-- and others have no caption at all -->
> <xsl:template match="TABLE">
> <xsl:element name="table">...</xsl:element>
> </xsl:template>
>
> ...
>
> <!-- hyperlink targets in headings -->
> <xsl:template match="A[@ID]" mode="tblhd">
> ...
> </xsl:template>
>
> <!-- hyperlink targets in rows -->
> <xsl:template
match="A[@ID][not(@CLASS='XRef')][not(ancestor::FOOTNOTES)]">
> ...
> </xsl:template>
> ==============
>
> As it stands this last template which matches all ID'ed "A" elements in
> tables causes these elements to be processed twice - once by the moded
> template and once by the standard template, so that the XML generated for
a
> hyperlink target appears both before the <table> element and once again
> inside it. So I need to fine tune the final template somehow: I need to
> exclude the pre-table context from the un-moded template. Does that make
> sense?
>
> Cheers
> Trevor

Current Thread