2010-02-13 4 views
9

Trong bảng tính XSLT của tôi, tôi cần xác định biến xsl: với một giá trị hoặc biến khác tùy thuộc vào giá trị của nút xml. Mã dưới đây chỉ ra những gì tôi đang cố gắng làm. Tôi muốn xác định nhiều biến theo cách này.Xác định các biến XSLT động bằng cách sử dụng xsl: select

Vấn đề chính là để chọn giá trị biến dựa trên giá trị nút của từng mục, việc chọn phải được thực hiện trong xsl: foreach và bất cứ khi nào tôi cố gắng xác định biến trong xsl: foreach, nó hiển thị lỗi.

<xsl:for-each select="WORKS/item"> 

<xsl:variable name="rate1"> 
    <xsl:choose> 
     <xsl:when test="rental='new'"> 
      <xsl:value-of select="'.15'" /> 
     </xsl:when> 
     <xsl:when test="rental='used'"> 
      <xsl:value-of select="'.30'" /> 
     </xsl:when> 
    </xsl:choose> 
</xsl:variable> 

<xsl:variable name="rent1" select="{$rate1}"> 

Lý do tôi muốn thực hiện điều này thông qua việc thay đổi giá trị biến là bởi vì các biến này sau đó được sử dụng trong một hàm toán học, làm tăng gấp bội biến bằng một giá trị nút (giá) mà sẽ khác nhau với mỗi . Đây là cách các biến, một khi được định nghĩa, sẽ được sử dụng. Cảm ơn bạn rất nhiều.

<div class="rental-period">1-4 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent1) div 100), "###.00")'/></em></div> 

    <div class="rental-period">5-7 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent2) div 100), "###.00")'/></em></div> 

    <div class="rental-period">8-14 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent3) div 100), "###.00")'/></em></div> 

UPDATE: Ok. Tôi đã thử các giải pháp được cung cấp dưới đây bởi Dark Falcon, nhưng nó giữ cho tôi một lỗi "mở và kết thúc thẻ không phù hợp". Lỗi tương tự như trước. Nó không có vẻ như có xsl: chọn nơi tôi có nó, vì những con số dòng là nơi mà các lỗi đến từ. Dưới đây là tất cả các mã stylesheet liên quan:

<xsl:template name="showPrice"> 
    <xsl:param name="rentalRate"/> 
     <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rentalRate) div 100), "###.00")'/></em></div> 
</xsl:template> 


<xsl:template match="/"> 

<xsl:for-each select="WORKS/item"> 

    <div class="rental-info"> 

    <xsl:choose> 
    <xsl:when test="rental='new'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rentalRate" select="'.15'"> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:when test="rental='used'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rentalRate" select="'.30'"> 
     </xsl:call-template> 
    </xsl:when> 
    </xsl:choose> 

     </div> 

</xsl:for-each> 

</xsl:template> 

Trả lời

0

Điều này có thể không phải là cách tốt nhất nhưng:

Tôi muốn giới thiệu bạn yếu tố logic của bạn để hiển thị giá cả ra một mẫu, sau đó sử dụng

<xsl:choose> 
    <xsl:when test="rental='new'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rent" select="'.15'" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:when test="rental='used'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rent" select="'.30'" /> 
     </xsl:call-template> 
    </xsl:when> 
</xsl:choose> 
+0

tôi đã cố gắng sử dụng các cuộc gọi mẫu chức năng như đề nghị, nhưng tôi nhận được các lỗi tương tự. Tôi đã cập nhật câu hỏi của mình ở trên. Cảm ơn! – Alan

+0

Rất tiếc, với-param cần phải là một thẻ trống. Ngay bây giờ nó không có thẻ đóng. –

11

tôi nghĩ rằng điều duy nhất xảy ra với mã ban đầu của bạn là cơ bản như sau:

<xsl:variable name="rent1" select="number($rate1)"> 

(Không {} bởi vì nó cho nó một select và có thể bạn muốn có một số trong biến đó, không phải là một chuỗi.)

Vì vậy, đó sẽ là một cái gì đó như thế này:

<xsl:variable name="rate1"> 
    <xsl:choose> 
    <xsl:when test="rental='new'">0.15</xsl:when> 
    <xsl:otherwise>0.30</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:variable name="rent1" select="number($rate1)"> 
+0

cuộc gọi tốt trên số(). Tôi sẽ đăng mã cuối cùng hoạt động. – Alan

2

Got nó. Đây là mã kết thúc hoạt động. Giải pháp là sự kết hợp của việc sử dụng "number()" và gọi biến trực tiếp thay vì xác định nó trước tiên. Cảm ơn tất cả.

<xsl:variable name="rate"> 
    <xsl:choose> 
     <xsl:when test="rental='new'"> 
      <xsl:value-of select="'.15'" /> 
     </xsl:when> 
      <xsl:otherwise> 
     <xsl:value-of select="'.30'"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * number($rate)) div 100), "###.00")'/></em></div> 
0

Hãy thử điều này:

<xsl:variable name="rate"> 
    <xsl:if test="rental='new'">.15</xsl:if> 
    <xsl:if test="rental='used'">.30</xsl:if> 
</xsl:variable> 

<xsl:call-template name="showPrice"> 
    <xsl:with-param name="rent"> 
      <xsl:value-of select="$rate"/> 
    </xsl:with-param> 
</xsl:call-template>