Использование переменной в выражении xPath - PullRequest
0 голосов
/ 15 мая 2019

С определением

<xsl:variable name="testVariable">
    <xsl:value-of select="'/author/'"/> 
</xsl:variable>

Я надеялся, что

<xsl:value-of select="concat('./book',$testVariable,'@attribute')" />

возвращает то же самое, что и

<xsl:value-of select="./book/author/@attribute" />

Но только последнее возвращает фактическое значениеатрибут, первый просто возвращает путь

./book/author/@attribute

Как сделать так, чтобы первый атрибут также возвращал значение атрибута?

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

Функция 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.

...