2011-01-13 34 views
14

Tôi đang gặp sự cố với xsl:variable. Tôi muốn tạo một biến với một giá trị phụ thuộc vào giá trị của một thuộc tính nút XML khác. Điều này làm việc tốt. Nhưng khi tôi cố tạo một biến với một giá trị chuỗi đại diện cho XPath, nó không hoạt động khi tôi cố gắng sử dụng nó như XPath trong một thẻ XSL sau này.xsl: biến là giá trị xpath cho thẻ xsl khác

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

tôi đã cố gắng: How to use xsl variable in xsl iftrouble with xsl:for-each selection using xsl:variable. Nhưng không có kết quả.

Trả lời

10

Nếu những con đường được biết trước như trường hợp này, sau đó bạn có thể sử dụng:

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

cảm ơn. đây không phải là những gì tôi đã hỏi, nhưng nó chính xác những gì tôi cần) –

+0

@igor milla: Bạn được chào đón. –

10

đánh giá năng động của một biểu thức XPath thường không được hỗ trợ trong XSLT (cả 1.0 và 2.0), tuy nhiên:

Chúng ta có thể thực hiện một đánh giá XPath động thay vì nói chung nếu chúng ta chỉ hạn chế mỗi đường dẫn vị trí là một yếu tố tên:

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

khi chuyển đổi này được áp dụng trên tài liệu XML này:

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

sự muốn, kết quả chính xác được sản xuất:

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

+1. Có vẻ vui. – Flack

Các vấn đề liên quan