Re: [xsl] distinct values by xslt

Subject: Re: [xsl] distinct values by xslt
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 18 May 2011 12:21:27 -0400
Hi,

As I understand it, this isn't really a "distinct values" problem, but rather a problem of discriminating between nodes within sets of nodes, all of which have the same values associated with them. The first question here is whether this must be XSLT 1.0, or whether XSLT 2.0 can be used.

If you want to determine whether a node is the first node in the document with a specific value associated with it (such as the first 'link' element with a given @rid value), a good solution can be to use a key:

<xsl:key name="link-by-rid" match="link" use="@rid"/>

Once this key is set up, you can examine any $link (where $link is a single 'link' element):

XSLT 1.0:

generate-id($link) = generate-id(key('link-by-rid',$link/@rid)[1])

XSLT 2.0:

$link is key('link-by-rid',$link/@rid)[1]

This method will also be faster, typically, than using the preceding:: axis.

You can do the same thing without a key, but that will often be slower too (it depends on the processor):

XSLT 1.0:

generate-id($link) = generate-id((//link[@rid=$link/@rid])[1])

XSLT 2.0:

$link is (//link[@rid=$link/@rid])[1]

The extra parentheses are necessary here, unless you opt to use the descendant:: axis instead of //.

Cheers,
Wendell

On 5/18/2011 11:36 AM, Syd Bauman wrote:
I'm afraid this is too confusing to delve into right now, but I'm
wondering about the test for a preceding link (line 07). Do you
imagine that it is testing from a current node of a<link>  that has
type=figure? It's not -- the current node is still the<p>  that fired
the whole template to match.

01.<xsl:template match="p">
02.<p class="Para_indented">
03.<xsl:apply-templates/>
04.</p>
05.<xsl:if test="link[@type='figure']">
06.<xsl:variable name="figid" select="link[@type='figure']/@rid"/>
07.<xsl:if test="not(preceding::link[@type='figure'][@rid=$figid])">
08.<xsl:apply-templates select="//object[@id=$figid]"/>
09.</xsl:if>
10.</xsl:if>
11.<xsl:if test="link[@type='table']">
12.<xsl:variable name="tableid" select="link[@type='table']/@rid"/>
13.<xsl:if test="not(preceding::link[@type='table'][@rid=$tableid])">
14.<xsl:apply-templates select="//object[@id=$tableid]"/>
15.</xsl:if>
16.</xsl:if>
17.</xsl:template>

Also I wonder if you are doing what you really want in line 06. The
variable figid is getting set to the sequence of all @rid values of
<link>  children of the current<p>  that match the criteria (have a
type= of 'figure'). For the test data, that means the string value of
figid is "f2 f3 f1".

Anyone have any idea about to find out distinct attribute value by
xslt. Figure 2 and Figure 3 are getting deleted by the logic
provided by me as shown in the below XSLT. Below are the require
things

XSLT
<xsl:template match="p">
<p class="Para_indented">
  <xsl:apply-templates/>
</p>
   <xsl:if test="link[@type='figure']">
    <xsl:variable name="figid" select="link[@type='figure']/@rid"/>
    <xsl:if test="not(preceding::link[@type='figure'][@rid=$figid])">
     <xsl:apply-templates select="//object[@id=$figid]"/>
    </xsl:if>
   </xsl:if>
   <xsl:if test="link[@type='table']">
    <xsl:variable name="tableid" select="link[@type='table']/@rid"/>
    <xsl:if test="not(preceding::link[@type='table'][@rid=$tableid])">
     <xsl:apply-templates select="//object[@id=$tableid]"/>
    </xsl:if>
   </xsl:if>
</xsl:template>


Input <p>First One of the primary goals (<link rid="f1" type="figure">Fig. 1</link>).</p> <p>second (see<link rid="f2" type="figure">Fig. 2</link>) and thos and <link rid="f3" type="figure">Fig. 3</link>). supporting the prediction that these species accelerate their development at the expense of growth (<link rid="f1" type="figure">Fig. 1</link>).</p>


Required OUTPUT <p class="Para_Indented">First One of the primary goals (<a class="figcit" href="#fig1">Fig. 1</a>).</p> <div class="divFigure"> <table class="Figure" width="100%" align="center" border="0" id="fig1"> </table> </div> <p class="Para_Indented">second (see<a class="figcit" href="#fig2">Fig. 2</a>) and thos and<a class="figcit" href="#fig3">Fig. 3</a>). supporting the prediction that these species accelerate their development at the expense of growth (<a class="figcit" href="#fig1">Fig. 1</a>).</p> <div class="divFigure"> <table class="Figure" width="100%" align="center" border="0" id="fig2"> </table> </div> <div class="divFigure"> <table class="Figure" width="100%" align="center" border="0" id="fig3"> </table> </div>

CURRENT OUTPUT
<p class="Para_Indented">First One of the primary goals (<a class="figcit"
href="#fig1">Fig. 1</a>).</p>
<div class="divFigure">
  <table class="Figure" width="100%" align="center" border="0" id="fig1">
  </table>
</div>
<p class="Para_Indented">second (see<a class="figcit" href="#fig2">Fig.
2</a>) and thos and<a class="figcit" href="#fig3">Fig. 3</a>). supporting
the prediction that these species accelerate their development at the
expense of growth (<a class="figcit" href="#fig1">Fig. 1</a>).</p>


--
======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread