Using dynamic xpath in XSLT

2020-02-15 06:49发布

问题:

I am using a variable say xpathvar in the XSLT whose value will be supplied at the time of call to XSLT. How can i achieve this? My XSLT file looks like -

<xsl:param name="xpathvar"/>
<xsl:param name="keyxpath"/>
 <xsl:template match="/">
  <listofResults>
    <xsl:for-each select="$xpathvar">
    <keyvalues><xsl:value-of select="xalan:evaluate(substring-before($keyxpath,'||'))"/></keyvalues>
    <keyvalues><xsl:value-of select="xalan:evaluate(substring-after($keyxpath,'||'))"/></keyvalues>
    </xsl:for-each>
  </listofResults>
 </xsl:template>
</xsl:stylesheet>

If I mention the variable in the for-each, it throws error. Please guide how can I achieve this.

Thanks!

回答1:

According to Global xsl:param containing xpath expression string it can't be done purely with plain old XSLT, you need to use the evaluate extension see: Xalan evaluate expression



回答2:

I dont think this can be done like this you must use xpath so example would be

<template match="Node[name=$xpathvar]" />


<xsl:for-each select="*[name()=$xpathvar]">
</xsl:for-each>

I think it does not let you use the variable directly because it is not a nodeset.



回答3:

If I mention the variable in the for-each, it throws error

In XSLT 1.0 (it looks you are using Xalan), you can iterate over node sets, only. So $xpathvar should be an instance of node set data type.

In XSLT 2.0 you can iterate over sequence (including scalar values).

Also, if the string containing the "dynamic" XPath expression is simple enough (only QName test step, maybe positional predicates) this could be done (as is already answered in SO) with standar XSLT.



标签: xslt xpath