我认为这是不可能的,但希望有一个明确的答案。
.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 中的代理语言值替换属性@French
我正在使用MSXML/XSLT 1.0
有什么办法可以做到这一点吗?
是的,您可以使用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>
- 使代码更易于阅读
- 如果您要更改翻译库,请更新模板,其余部分将随之而来。