xsl-list
[Top] [All Lists]

Re: Filtering duplicated data problem

2004-11-03 14:23:38
Hi Fanyin Wang,

I'm not sure it is really a grouping problem, though it is related. But I can tell you where your script fails. I suspect you use the following line to determine the distinctness of some item/@id, but it obviously fails:
       <xsl:if test="not(preceding-sibling::item/@id = $pass_id)">

At least one problem is that the preceding-sibling does not go up the section element an down a preceding section. Use the preceding axis for this. But I tried and this also doesn't seem to work and I haven't figured out why exactly.

But I did come up with a solution (see below) that builds an index on what you are searching and uses that index to determine whether an item with a specific @id value is the first in document order or not. The xsl:key defines the index, which contains a rather complex match expression, but this expression merely combines your own if and foreach in the item template. The tricky part comes in passage2 template, where I use generate-id to determine whether the first of all OE-items with the same id is actually the current item. Only the first in document order is printed.

Grtz,
Geert

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xml:space="default">

<xsl:key name="OE-related-items-by-id" match="item[(_at_)title != ''][following-sibling::item[itemmetadata/qtimetadata/qtimetadatafield[fieldlabel = 'item_type_code'][fieldentry ='OE']]]" use="@id" />

 <!--xsl:template match="/">
   <xsl:apply-templates select="//item" mode="passage"/>
 </xsl:template-->

 <xsl:template match="/">
   <xsl:apply-templates select="//item" mode="passage2"/>
 </xsl:template>

 <xsl:template match="item" mode="passage">
<xsl:if test="descendant::qtimetadatafield/fieldentry[preceding-sibling::node()[text()='item_type_code']]/text()='OE'">
     <xsl:for-each select="preceding-sibling::item[(_at_)title !='']">
       <xsl:variable name="pass_id" select="@id"/>
       <xsl:if test="not(preceding-sibling::item/@id = $pass_id)">
         pa_id= <xsl:value-of select="@id"/><br></br>
       </xsl:if>
     </xsl:for-each>
   </xsl:if>
 </xsl:template>

 <xsl:template match="item" mode="passage2">
   <xsl:if test="generate-id(.) = generate-id(key('OE-related-items-by-id', 
@id)[1])">
     pa_id= <xsl:value-of select="@id"/><br></br>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>


<Prev in Thread] Current Thread [Next in Thread>