Can I select in XPath based on a variable attribute?

13,808

Yes, you can use a local-name() to find an element or attribute with a given dynamic value. I've stored the lookup value in a xsl:variable:

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

If namespaces are involved, it is good practice to also include a check for namespace-uri()=..., as of course there may be two elements with the same name, but in different namespaces.

Edit

In hindsight, use of a variable may make the transform easier to read / maintain, but isn't essential - this can be done directly as well:

<xsl:value-of select="//translation[@English='title']/@*[local-name()=//agentlang]" />
Share:
13,808
DannykPowell
Author by

DannykPowell

Updated on June 19, 2022

Comments

  • DannykPowell
    DannykPowell almost 2 years

    I think this isn't possible but would like to have a definitive answer.

    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>
    

    then in the XSL there is a simple transform of the main books info, but I want the headers to be translated according to the translation xml- something like this will work:

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

    But I want to replace the attribute @French with the agentlang value from the XML

    I'm using MSXML / XSLT 1.0

    Is there any way this can be done?