RE: [xsl] NMTOKENS and xsl:key

Subject: RE: [xsl] NMTOKENS and xsl:key
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 8 Jan 2007 00:52:12 -0000
You don't say whether this is a schema-aware stylesheet. If it is, then the
type xs:NMTOKENS will be recognized, the typed value of @target will be a
sequence of tokens, and 

<xsl:key match="item" use="@target"/>

will index the value of each token.

If it's not schema-aware then you need to split the value "by hand":

<xsl:key match="item" use="tokenize(@target, '\s+')"/> 

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Houghton,Andrew [mailto:houghtoa@xxxxxxxx] 
> Sent: 07 January 2007 22:58
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] NMTOKENS and xsl:key
> 
> 
> I'm hoping someone on the list might be able to provide some 
> insight in how I might address the following issue.  I'm 
> using Saxon 8.8 and XSL 2.0 for developing a transform.  The 
> source document looks something like:
> 
> <document>
>   <section>
>     <item target="abc def ghi"/>
>     <item target="foo bar"/>
>     <item target="abc bar"/>
>     <item target="def foo"/>
>   </section>
>   <section>
>     <item target="abc"/>
>     <item target="foo"/>
>     <item target="ghi bar"/>
>   </section>
> </document>
> 
> The <section> and <item> elements are repeatable and the 
> target attribute is an NMTOKEN list.
> 
> Since the source document is quite large, I was hoping to use 
> xsl:key to index each token value in the item's target 
> attribute so I could query for all the items that might 
> contain a particular token value, e.g., "foo".
> 
> However, looking at xsl:key it seems to me that it will only 
> index the entire NMTOKEN list as a single value.  What I'm 
> trying to accomplish when I query for the token value "foo", 
> is that I want xsl:key to return the following node
> list:
> 
>   /document/section[1]/item[2]
>   /document/section[1]/item[4]
>   /document/section[2]/item[2]
> 
> correspondingly if I query for "abc" I want xsl:key to be 
> able to return the following node list:
> 
>   /document/section[1]/item[1]
>   /document/section[1]/item[3]
>   /document/section[2]/item[1]
> 
> does anybody know of anyway I can get xsl:key to index each 
> token in the NMTOKEN list for the target attribute?  I 
> realize I could write an XPath expression, but continually 
> iterating over a large document looking for different token 
> values would be extremely slow which is one of the main 
> reason why I was looking at using xsl:key.
> 
> Can you think of any alternate solutions to the problem.
> 
> BTW, the tokens in the list are *not* known in advance to the 
> transform.
> 
> 
> Thanks, Andy.

Current Thread