web-dev-qa-db-fra.com

xsl: variable en tant que valeur xpath pour une autre balise xsl

J'ai des problèmes avec xsl:variable. Je souhaite créer une variable avec une valeur qui dépend de la valeur d'un autre attribut de noeud XML. Cela fonctionne bien. Mais lorsque j'essaie de créer une variable avec une valeur de chaîne représentant XPath, cela ne fonctionne tout simplement pas lorsque j'essaie de l'utiliser comme XPath dans une balise XSL ultérieure. 

<xsl:variable name="test">  
  <xsl:choose>
    <xsl:when test="node/@attribute=0">string/represent/xpath/1</xsl:when>
    <xsl:otherwise>string/represent/xpath/2</xsl:otherwise>
  </xsl:choose>       
</xsl:variable>                 
<xsl:for-each select="$test">
  [...]
</xsl:for-each>

J'ai essayé: Comment utiliser la variable xsl dans xsl si Et Problème avec xsl: for-chaque sélection utilisant xsl: variable . Mais sans résultat.

14
igor milla

Si ces chemins sont connus à l'avance comme dans ce cas, vous pouvez utiliser:

<xsl:variable name="vCondition" select="node/@attribute = 0"/>
<xsl:variable name="test" select="actual/path[$vCondition] |
                                  other/actual/path[not($vCondition)]"/>
10
user357812

L'évaluation dynamique d'une expression XPath n'est généralement pas prise en charge dans XSLT (1.0 et 2.0), toutefois:

Nous pouvons implémenter un évaluateur XPath dynamique plutôt général si nous limitons chaque chemin d'emplacement à un nom d'élément :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="inputId" select="'param/yyy/value'"/>

 <xsl:variable name="vXpathExpression"
  select="concat('root/meta/url_params/', $inputId)"/>

 <xsl:template match="/">
  <xsl:value-of select="$vXpathExpression"/>: <xsl:text/>

  <xsl:call-template name="getNodeValue">
    <xsl:with-param name="pExpression"
         select="$vXpathExpression"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="getNodeValue">
   <xsl:param name="pExpression"/>
   <xsl:param name="pCurrentNode" select="."/>

   <xsl:choose>
    <xsl:when test="not(contains($pExpression, '/'))">
      <xsl:value-of select="$pCurrentNode/*[name()=$pExpression]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="getNodeValue">
        <xsl:with-param name="pExpression"
          select="substring-after($pExpression, '/')"/>
        <xsl:with-param name="pCurrentNode" select=
        "$pCurrentNode/*[name()=substring-before($pExpression, '/')]"/>
      </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

lorsque cette transformation est appliquée sur ce document XML :

<root>
  <meta>
    <url_params>
      <param>
        <xxx>
          <value>5</value>
        </xxx>
      </param>
      <param>
        <yyy>
          <value>8</value>
        </yyy>
      </param>
    </url_params>
  </meta>
</root>

le résultat recherché est correct :

root/meta/url_params/param/yyy/value: 8
12
Dimitre Novatchev

Cela n’est pas possible de manière native dans XSLT 1.0, mais vous pouvez utiliser une bibliothèque d’extensions telle que dyn:

http://www.exslt.org/dyn/functions/evaluate/dyn.evaluate.html

La fonction dyn:evaluate évalue une chaîne en tant qu'expression XPath.

0
Zkoh