Могу ли я выбрать в 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>
- Сделайте код проще для чтения
- Если вы измените библиотеку перевода, вы обновите шаблон, а остальное последует.