我可以根据变量属性在XPath中选择吗?

Dan*_*ell 4 xslt xpath xpath-1.0 xslt-1.0

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

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>
Run Code Online (Sandbox Code Playgroud)

然后在XSL中有一个主要书籍信息的简单转换,但我希望根据翻译xml翻译标题 - 这样的东西将起作用:

<xsl:value-of select="//translation[@English='title']/@French"/>
<xsl:value-of select="//translation[@English='Author']/@French"/>
Run Code Online (Sandbox Code Playgroud)

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

我正在使用MSXML/XSLT 1.0

有什么办法可以做到吗?

Stu*_*tLC 7

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

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

如果涉及名称空间,最好还包括检查namespace-uri()=...,当然可能有两个具有相同名称但在不同名称空间中的元素.

编辑

事后看来,使用变量可以使转换更容易阅读/维护,但不是必需的 - 这也可以直接完成:

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