Функция concat () возвращает строку, она волшебным образом не интерпретирует эту строку как исходный код выражения XPath, а затем оценивает это выражение.
Обратите внимание, что
<xsl:variable name="testVariable">
<xsl:value-of select="'/author/'"/>
</xsl:variable>
может быть в 99% случаев переписано как
<xsl:variable name="testVariable" select="'/author/'"/>
, который не только меньше кода, но и намного эффективнее. (К сожалению, остальные 1% случаев означают, что оптимизатор не может сделать это переписать автоматически.)
Обычно вы можете достичь того, чего хотите, используя
select="/book/*[name()=$testVariable]/@attribute"
Иногда вам нужно пойти немного дальше, в этом случае вам нужно что-то вроде xsl:evaluate
в XSLT 3.0.