5

我认为这是不可能的,但希望有一个明确的答案。

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"/>

但我想用 XML 中的 agentlang 值替换属性 @French

我正在使用 MSXML / XSLT 1.0

有什么办法可以做到这一点?

4

2 回答 2

8

是的,您可以使用 alocal-name()来查找具有给定动态值的元素或属性。我已将查找值存储在xsl:variable中:

<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]" />
于 2012-09-17T15:00:59.573 回答
0

您可以使用模板获得相同的结果

<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>
  • 使代码更易于阅读
  • 如果您要更改翻译库,则更新模板,其余的将随之而来。
于 2016-09-26T15:46:46.120 回答