2011-01-13 23 views
14

Tengo problemas con xsl:variable. Quiero crear una variable con un valor que depende del valor de otro atributo de nodo XML. Esto funciona bien Pero cuando trato de crear una variable con un valor de cadena que represente XPath, simplemente no funciona cuando intento usarlo como XPath en una etiqueta XSL posterior.xsl: variable como valor de xpath para otra etiqueta xsl

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

me trataron: How to use xsl variable in xsl if y trouble with xsl:for-each selection using xsl:variable. Pero sin resultados

Respuesta

10

Si aquellos ruta y conocidos de antemano, como este caso, entonces usted puede utilizar:

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

gracias. esto no es exactamente lo que estaba preguntando, pero es exactamente lo que se necesitaba) –

+0

@igor milla: De nada. –

10

evaluación dinámica de una expresión XPath generalmente no se admite en XSLT (ambos 1,0 y 2,0), sin embargo:

Podemos implementar un evaluador bastante general dinámico XPath si sólo Restringir cada ruta de ubicación a ser un elemento nombrar:

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

cuando se aplica esta transformación en este documento XML:

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

el, resultado correcto querido se produce:

root/meta/url_params/param/yyy/value: 8 
+0

+1. Se ve divertido. – Flack