Re: [xsl] general purpose filter stylesheet

Subject: Re: [xsl] general purpose filter stylesheet
From: Peter Davis <pdavis152@xxxxxxxxx>
Date: Thu, 14 Mar 2002 18:53:09 -0800
I can't think of any way to do this without modifying the query.  For 
example, if you could get:

((descendent-or-self::author='Date' or descendent-or-self::title='Database 
Systems') and descendent-or-self::number='1')

Then it would be pretty simple to xxx:evaluate() this for every node and 
output the node if the test is true (although it would be innefficient).

The problem is that XSLT isn't really the best language to be able to modify 
the query like that... good luck.


...

Scratch that, I can think of a way (but an almost infinitely more 
innefficient way than above).  It relies on your processor to provide an 
xxx:evaluate() function and be able to convert an RTF to a node-set.

<xsl:param name="query">true()</xsl:param>

<xsl:template match="*">
  <xsl:variable name="flattened">
    <xsl:copy>
      <xsl:copy-of select="@* | text()"/>
      <xsl:apply-templates mode="flatten"/>
    </xsl:copy>
  </xsl:variable>
  <xsl:if test="xxx:evaluate(concat('$flattened/*[', $query, ']'))">
    <xsl:copy>
      <xsl:copy-of select="@* | text()"/>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:if>
</xsl:template>

<xsl:template match="*" mode="flatten"/>
  <xsl:copy>
    <xsl:copy-of select="@* | text()"/>
  </xsl:copy>
  <xsl:apply-templates select="*" mode="flatten"/>
</xsl:template>

For each node, it creates an RTF called $flattened that contains a copy of 
the node and its attributes/text and all of its children, but the children 
are flattened so there is never more than one level deep of children.  Then 
evaluate the query with the copy of the current node with the modified 
children and see if it matches.  If it does, then copy the node to the output 
tree and repeat the process.

This would get pretty slow pretty fast, and it requires that the query is 
always in a flattened form (no child/parent tests).  But it is the only way I 
can think of without modifying the original query.

On Thursday 14 March 2002 14:17, Robert Sösemann wrote:
> My query is an boolean expression:
> ###########################
>
> ((author='Date' or title='Database Systems') and number='1')
> PROBLEM: 'number' is not part of the same parent as 'author'

-- 
Peter Davis
I'd rather push my Harley than ride a rice burner.

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread