Вы можете обойти XSLT 1.0 без поддержки использования содержимого переменной в качестве набора узлов.Вам придется полагаться на расширения, добавленные создателем парсера.Например, Microsoft предложила функцию для обхода этого: node-set ()
Ваш XSL будет выглядеть следующим образом:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:template match="/">
<xsl:variable name="map">
<map>
<entry key="key-1">value1</entry>
<entry key="key-2">value2</entry>
<entry key="key-3">value3</entry>
</map>
</xsl:variable>
<output>
<xsl:value-of select="msxsl:node-set($map)/map/entry[@key='key-1']"/>
</output>
</xsl:template>
</xsl:stylesheet>
Обратите внимание на пространство имен и префикс msxsl здесь.Это будет работать только в приложениях, основанных на синтаксическом анализаторе Microsoft (например, Internet Explorer использует его, а также .NET).Другие парсеры могут иметь или не иметь такого расширения (например, у Saxxon, но оно немного по-другому).Но это исключает зависимость от XSLT 2.0, поскольку в XSLT 1.0 это будет нормально работать, и Microsoft еще не поддерживает XSLT 2.0 в своей библиотеке XML (если только они не добавили его недавно).
В зависимости от того, какой анализатор выВы используете, выше может работать хорошо для вас, в противном случае ответ Per T лучше для вас.