Хотя полная динамическая оценка XPath не входит ни в XSLT 1.0 / XPath 1.0, ни в XSLT 2.0 / XPath 2.0, можно создать реализацию XSLT 1.0 для чего-то, что будет работать довольно ограниченным образом :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vrtfEvalResult">
<xsl:call-template name="eval">
<xsl:with-param name="pPath" select="'/bookstore/author/book'"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select="ext:node-set($vrtfEvalResult)/*">
<p><xsl:value-of select="title" /></p>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
<xsl:template match="Path" name="eval">
<xsl:param name="pPath" select="."/>
<xsl:param name="pContext" select="/"/>
<xsl:choose>
<!-- If there is something to evaluate -->
<xsl:when test="string-length($pPath) >0">
<xsl:variable name="vPath" select=
"substring($pPath,2)"/>
<xsl:variable name="vNameTest">
<xsl:choose>
<xsl:when test="not(contains($vPath, '/'))">
<xsl:value-of select="$vPath"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select=
"substring-before($vPath, '/')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="eval">
<xsl:with-param name="pPath" select=
"substring-after($pPath, $vNameTest)"/>
<xsl:with-param name="pContext" select=
"$pContext/*[name()=$vNameTest]"/>
</xsl:call-template>
</xsl:when>
<!-- Otherwise we have evaluated completely the path -->
<xsl:otherwise>
<xsl:copy-of select="$pContext"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному XML-документу :
<bookstore>
<author name="King">
<book id="book1">
<title>Title1</title>
</book>
<book id="book2">
<title>Title2</title>
</book>
<book id="book3">
<title>Title3</title>
</book>
<book id="book4">
<title>Title4</title>
</book>
</author>
</bookstore>
желаемый, правильный результат получается :
<p>Title1</p>
<p>Title2</p>
<p>Title3</p>
<p>Title4</p>