Могу ли я выбрать в XPath на основе атрибута переменной?

Я думаю, что это невозможно, но хотелось бы получить окончательный ответ.

XML:

  <agentlang>French</agentlang>
  ...
  <books>
    <book>
      <title>My Book</title>
      <author>Me</author>
    </book>
    <book>
      <title>XPath 101</title>
      <author>You</author>
  </book>
  ...
 </books>
 .....
 <translations>
    <translation English="title" French="titre" German="Titel" />
    <translation English="author" French="auteur" German="Autor" />
 </translations>

затем в XSL есть простое преобразование информации о главных книгах, но я хочу, чтобы заголовки были переведены в соответствии с переводом xml - что-то вроде этого будет работать:

<xsl:value-of select="//translation[@English='title']/@French"/>
<xsl:value-of select="//translation[@English='Author']/@French"/>

Но я хочу заменить атрибут @French на значение agentlang из XML

Я использую MSXML / XSLT 1.0

Есть ли способ сделать это?

2 ответа

Решение

Да, вы можете использовать local-name() найти элемент или атрибут с заданным динамическим значением. Я сохранил значение поиска в переменной xsl::

<xsl:variable name="lang" select="//agentlang/text()" />
<xsl:value-of select="//translation[@English='title']/@*[local-name()=$lang]" />

Если задействованы пространства имен, рекомендуется также включить проверку namespace-uri()=..., как, конечно, может быть два элемента с одинаковыми именами, но в разных пространствах имен.

редактировать

Оглядываясь назад, использование переменной может сделать преобразование более легким для чтения / поддержки, но это не обязательно - это можно сделать также напрямую:

<xsl:value-of select="//translation[@English='title']/@*[local-name()=//agentlang]" />

Вы можете получить тот же результат с шаблоном

<xsl:template name="translate_english_to_local">
  <xsl:param name="text>

  <xsl:value-of select="//translation[@English=$text]/@*[local-name()=//agentlang]" />

</xsl:template>

Что приведет к:

<xsl:call-template="translate_english_to_local">
    <xsl:with-param name="text">title</xsl:with-param>
</xsl:call-template>
  • Сделайте код проще для чтения
  • Если вы измените библиотеку перевода, вы обновите шаблон, а остальное последует.
Другие вопросы по тегам