XSL. Вычислить выражение

Извините за мой английский.

XSL 1.0. Как вычислить выражение из значения элемента или атрибута?

Например XML:

<position>
  <localizedName>ref-help</localizedName>
  <reference>concat('../help/', $lang, '/index.html')</reference>
</position>

Я пытаюсь использовать выражение из атрибута «ссылка»:

<xsl:for-each select="/content/positions/position">
        <li>
          <!--Save expression to variable...-->
          <xsl:variable name="path" select="reference"/>
          <!--Evaluate variable and set it value to 'href'-->
          <a target="frDocument" href="{$path}">
            <xsl:variable name="x" select="localizedName"/>
            <xsl:value-of select="$resources/lang:resources/lang:record[@id=$x]"/>
          </a>
        </li>
      </xsl:for-each>

Но я получаю строку:

file:///C:/sendbox/author/application/support/concat('../help/',%20%24lang,%20'/index.html')

Как я могу это оценить?

С уважением


person Andrey Bushman    schedule 06.04.2012    source источник


Ответы (1)


Если ваш процессор XSLT реализует расширения EXSLT, вы можете ссылаться на функция, которая динамически оценивает строки как выражения XPath:

<xsl:stylesheet 
  version="1.0"
  xmlns="http://www.w3.org/1999/XSL/Transform"
  xmlns:dyn="http://exslt.org/dynamic"
  extension-element-prefixes="dyn"
>
  <xsl:template match="content">
    <xsl:apply-templates select="positions/position" />
  </xsl:template>

  <xsl:template match="position">
    <li>
      <a target="frDocument" href="{dyn:evaluate(reference)}">
        <xsl:value-of select="
          $resources/lang:resources/lang:record[@id=current()/localizedName]
        "/>
      </a>
    </li>
  </xsl:template>
</xsl:stylesheet>

Примечание:

  • нет необходимости сохранять вещи в переменной перед их использованием
  • есть функция current(), которую вы могли пропустить
  • используйте <xsl:apply-templates> и <xsl:template> вместо <xsl:for-each>
person Tomalak    schedule 06.04.2012
comment
Я использую браузеры (Internet Explorer 9, Google Chrome 18.0.1025.151 м и Safari 5.1.5). Выражение dyn:evaluate в нем не работает. :((( - person Andrey Bushman; 06.04.2012
comment
Тогда вам не повезло, и вы должны использовать другой подход. Оценка строк как выражений не встроена в XSLT. Вы не думали о преобразовании на стороне сервера? - person Tomalak; 06.04.2012
comment
К сожалению, эти файлы размещаются на локальных компьютерах. - person Andrey Bushman; 06.04.2012
comment
Если вы не измените какую-то часть своего подхода, у вас не будет возможности делать то, что вы хотите. Неиспользование выражений XPath в <reference> было бы одним из способов изменить ваш подход. Используйте <reference>../help/$lang/index.html</reference> и используйте некоторую форму замены строки XSLT, чтобы заменить "$lang" значением $lang. - person Tomalak; 06.04.2012