2011-01-13 11 views
14

Mam problemy z xsl:variable. Chcę utworzyć zmienną o wartości zależnej od wartości innego atrybutu węzła XML. To działa dobrze. Ale gdy próbuję utworzyć zmienną z wartością ciągu znaków reprezentującą XPath, po prostu nie działa, gdy próbuję użyć go jako XPath w późniejszym znaczniku XSL.xsl: zmienna jako wartość xpath dla innego znacznika 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> 

Próbowałem: How to use xsl variable in xsl if i trouble with xsl:for-each selection using xsl:variable. Ale bez rezultatów.

Odpowiedz

10

Jeśli te ścieżki są znane z góry niczym takim przypadku można użyć:

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

dzięki. nie jest to dokładnie to, o co prosiłem, ale dokładnie to, czego potrzebowałem) –

+0

@igor milla: Nie ma za co. –

10

Dynamiczna ocena wyrażenia XPath jest na ogół nie są obsługiwane w XSLT (oba 1.0 i 2.0), jednakże:

Możemy zaimplementować raczej ogólny oceniającego dynamiczny XPath gdybyśmy tylko ograniczać każdą ścieżkę lokalizacji, aby być elementem wymienić:

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

kiedy ta transformacja jest stosowane na tym dokumencie XML:

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

The Wanted, poprawny wynik jest produkowany:

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

+1. Wygląda na niezłą zabawę. – Flack