I am trying to evaluate a dynamic xpath using ixsl:eval() in Saxon-ce with xslt 2.0 but does not seem to be working. Here is the illustrative XML
<things>
<thing>
<name>widget one</name>
<number>10</number>
<type>metal</type>
<subtypes>
<subtype>red<subtype>
</subtypes>
</thing>
<thing>
<name>widget two</name>
<number>11</number>
<type>wood</type>
<subtypes>
<subtype>red</subtype>
<subtype>blue</subtype>
</subtypes>
</thing>
</things>
and a piece of the xsl 2.0 style sheet I am trying to eval (the various parameters are passed by another part of the larger xsl stylesheet)
<template name="display" match="things">
<xsl:param name="num"/>
<xsl:param name="type" as="xs:string"/>
<xsl:param name="subtype" as="xs:string"/>
<xsl:variable name="xpathExp" as="xs:string">
<xsl:text>things/thing</xsl:text>
<xsl:if test="not($num = 'all')>
<xsl:copy-of select="concat('[number=',$num,']')"/>
</xsl:if>
<xsl:if test="not($type = 'all')>
<xsl:copy-of select="concat('[type=''',$type,''']')"/>
</xsl:if>
<xsl:if test="note($subtype = 'all')>
<xsl:copy-of select="concat('[subtype/subtypes=''',$subtype,''']')/>
</xsl:if>
</xsl:variable>
<xsl:result-document href="#display" method="ixsl:replace-content">
<xsl:for-each select="ixsl:eval($xpathExp)">
<xsl:sort select="name"/>
</xsl:for-each>
</template>
When I replace the eval statement with a explicit xpath statement the code works, so for some reason the eval on $xpathExp is not working. Ideas?
* Edit * Here is a better XML example:
<things>
<thing>
<name>widget one</name>
<number>10</number>
<type>metal</type>
<subtypes>
<subtype>red<subtype>
</subtypes>
</thing>
<thing>
<name>widget two</name>
<number>11</number>
<type>wood</type>
<subtypes>
<subtype>red</subtype>
<subtype>blue</subtype>
</subtypes>
</thing>
<thing>
<name>widget three</name>
<number>11</number>
<type>metal</type>
<subtypes>
<subtype>blue</subtype>
</subtypes>
</thing>
</things>
The user can select values via dropboxes for number, type and subtype. Depending on the user's selection, a list of thing names is displayed. So for example, if the user selects a number of 11 and the subtype of red it would just display widget two. If they select instead a subtype of blue it would display the name of widgets two and three.
So the base xpath filter is things/thing. If the user selects a number value I want to append [number=$num] to the xpath expression so ti would be things/thing[number=$num]. If they select more than one item, lets say number and type, [number=$num][type=$type] would be appended to the base xpath and I would have things/thing[number=$num][type=$type].
Basically what I trying to avoid is having to individually code all possible permutations and combinations of possible user selections.
Does that help?