2013-09-27 223 views
6

ví dụ đơn giản:XSLT - Có cách nào để thêm vào các thuộc tính được thêm bằng <xsl: attribute> không?

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper" /> 
    <xsl:attribute name="myattr">second calculated value</xsl:attribute> 
    </myelem> 
</xsl:template> 

Có một số cách để lần thứ hai để thêm giá trị tính toán với cùng myattr thuộc tính trong nút kết quả thứ hai?

Tôi đã thấy có thể sử dụng mẫu giá trị thuộc tính nếu thuộc tính đích nằm trong xml nguồn, nhưng tôi có thể tham chiếu bằng cách nào đó giá trị của thuộc tính mà tôi đã thêm vào nút kết quả trước đó không?

Cảm ơn trước!

Trả lời

4

Một cách tiếp cận bạn có thể thực hiện là thêm tham số vào mẫu trình trợ giúp của bạn, mà bạn thêm vào giá trị thuộc tính.

<xsl:template name="helper"> 
    <xsl:param name="extra" /> 
    <xsl:attribute name="myattr">first calculated value<xsl:value-of select="$extra" /></xsl:attribute> 
</xsl:template> 

Sau đó, bạn có thể chỉ là quá khứ trong giá trị tính toán thứ hai của bạn là tham số

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper"> 
     <xsl:with-param name="extra">second calculated value</xsl:with-param> 
    </xsl:call-template> 
    </myelem> 
</xsl:template> 

Bạn không cần phải thiết lập các param với mỗi cuộc gọi mặc dù. Nếu bạn không muốn bất kỳ thứ gì được thêm vào, chỉ cần gọi là mẫu helper không có tham số và sẽ không thêm bất kỳ thứ gì vào giá trị được tính đầu tiên.

+0

Ý tưởng tuyệt vời! Còn một câu hỏi nữa: tôi có thể thêm nhiều tham số hơn vào mẫu 'helper' và có khả năng sử dụng nhiều phần tử' 'hơn trong cuộc gọi không? –

+0

(Trả lời câu hỏi của riêng tôi :) Có, người ta có thể sử dụng nhiều tham số hơn. –

0

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

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
    </xsl:template> 
    <xsl:template match="/"> 
    <myelem> 
     <xsl:call-template name="helper" /> 
     <xsl:variable name="temp" select="@myattr"/> 
     <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($temp, 'second calculated value')" /> 
     </xsl:attribute> 
    </myelem> 
    </xsl:template> 
+3

Điều đó sẽ không hoạt động - 'select =" @ myattr "' sẽ tìm trong nút ngữ cảnh của cây đầu vào chứ không phải cây đầu ra. Trong trường hợp này nút đó là nút gốc của tài liệu ('/') mà không bao giờ có bất kỳ thuộc tính nào. –

2

Phương pháp đơn giản nhất sẽ được thay đổi làm tổ một chút - có helper chỉ cần tạo các nút văn bản và đặt <xsl:attribute> trong mẫu gọi:

<xsl:template name="helper"> 
    <xsl:text>first calculated value</xsl:text> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:attribute name="myattr"> 
     <xsl:call-template name="helper" /> 
     <xsl:text>second calculated value</xsl:text> 
    </xsl:attribute> 
    </myelem> 
</xsl:template> 

này sẽ đặt myattr thành "giá trị được tính toán đầu tiêngiá trị tính toán thứ hai" - nếu bạn muốn một khoảng trống giữa "giá trị" và "giây", bạn phải bao gồm giá trị đó bên trong một trong các thành phần <xsl:text>

 <xsl:text> second calculated value</xsl:text> 
+0

Đó là câu trả lời hay, mặc dù trong trường hợp thực, mẫu 'helper' bổ sung thêm nhiều thuộc tính hơn, và trong nút' 'có thể hoặc không sửa đổi' myattr' theo các phép tính nhất định. Vì vậy, ý tưởng tốt đẹp nhưng không thuận tiện trong trường hợp của tôi. –

0

Trong khi đó là nhiều hơn hoặc ít hơn cùng một điều, tôi muốn cách súc tích hơn của việc tạo ra một biến thay vì có một mẫu trợ giúp. Lưu ý rằng bạn vẫn có thể gọi mẫu từ bên trong xsl: variable cho trường hợp phức tạp hơn.

<xsl:template match="/"> 
    <myelem> 
    <xsl:variable name="first">first calculated value </xsl:variable > 
    <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($first, 'second calculated value')"/> 
    </xsl:attribute> 
    </myelem> 
</xsl:template>