You cannot use a result tree fragment in a XPath expression in XSLT 1.0. You need to (1) either use XSLT 2.0 or (2) use fn:document()
to be able to get to the map values. I've answered a similar question recently which will work in your case aswell.
The XSLT 1.0 solution:
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@key='key-1']"/>
As described in the XSLT 1.0 specification:
document("")
refers to the root node of
the stylesheet; the tree
representation of the stylesheet is
exactly the same as if the XML
document containing the stylesheet was
the initial source document.
However, you don't need to use xsl:variable
for this. You could specify your map node directly under xsl:stylesheet
, but you must remember that a top level elements must have a non null namespace URI:
<xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="some.uri" exclude-result-prefixes="my">
<my:map>
<entry key="key-1">value1</entry>
<entry key="key-2">value2</entry>
<entry key="key-3">value3</entry>
</my:map>
<xsl:template match="/">
<output>
<xsl:value-of select="document('')/*/my:map/entry[@key='key-1']"/>
</output>
</xsl:template>
</xsl:stylesheet>
In XSLT 2.0 you could've done it the way you wanted to:
<xsl:variable name="map">
<entry key="key-1">value1</entry>
<entry key="key-2">value2</entry>
<entry key="key-3">value3</entry>
</xsl:variable>
<xsl:template match="/">
<output>
<xsl:value-of select="$map/entry[@key='key-1']"/>
</output>
</xsl:template>