[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] key() now has 3 arguments ... right

Subject: Re: [xsl] key() now has 3 arguments ... right
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Wed, 25 Apr 2012 14:22:59 +0100

You can use the three argument form there, but that is not semantically equivalent. It matches _every_ element if the key returns a node, and matches no element otherwise. To match nodes if they are returned by the key you need an expression using ancestor-or-self as I gave before or perhaps more directly:

<xsl:template match="*[some $k in key('maindoc','Sal',$doc2) satisfies (. is $k)]"

I would tend to write this as:

<xsl:variable name="special" select="key('maindoc','Sal',$doc2)"/>

<xsl:template match="*[. intersect $special]"/>

In XSLT 3.0 you can write this match pattern as

<xsl:template match="$special"/>

which matches any node in the value of the global variable $special.

I've come across a few use cases where it's better pre-evaluate all the "special" nodes in a global variable than to do the computation to test whether a node is "special" within the match pattern itself; it's obviously a performance trade-off.

Michael Kay

Current Thread