2012-03-30 23 views
17

Trong XSLT 1.0,/sạch/con đường ngắn nhất nên để vượt qua các nút bối cảnh hiện nay một mẫu gọi và có mà nút trở thành nút bối cảnh bên trong gọi là mẫu là gì? Nó sẽ là tốt đẹp (nó sẽ, phải không?) Nếu một mẫu không có xsl: param và được gọi bởi một mẫu gọi trống sẽ chỉ đơn giản là chọn nút bối cảnh của người gọi, nhưng tốt nhất tôi có thể nghĩ là:XSLT đèo bối cảnh hiện nay trong cuộc gọi-mẫu

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

với

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

Trả lời

22

nó sẽ được tốt đẹp (nó sẽ, phải không?) nếu mẫu không có xsl:param và gọi bằng một sản phẩm nào call-template chỉ cần nhặt context node người gọi.

Đây chính là cách xsl:call-template được định nghĩa trong đặc tả W3C XSLT 1.0 (và 2.0), và thực hiện bởi bất kỳ bộ xử lý XSLT compliant.

Dưới đây là một ví dụ nhỏ:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="a"> 
    <xsl:call-template name="currentName"/> 
</xsl:template> 

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

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

<t> 
<a/> 
</t> 

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

Name: a 
+0

Cảm ơn Dimitre. Tôi không thấy tài liệu này và nó dường như không hoạt động khi tôi thử nó. Tôi đã không tìm đúng nơi và phải làm điều gì đó sai trái. +1 Q đã trả lời. Chúc mừng. – JPM

+0

@JPM: Bạn được chào đón. Bạn có thể đã được tìm kiếm tại 'xsl: hướng dẫn function' trong XSLT 2.0 - đó là khác biệt so với một mẫu tên là ở chỗ nó không nhận được bối cảnh của người gọi của hàm và nếu người gọi có để vượt qua nút ngữ cảnh của nó dưới dạng tham số, nếu nút ngữ cảnh này phải được chuyển. –

4

Chỉ cần giải thích những gì Dimitre nói.

Khi bạn gọi một mẫu từ một nút, bạn đã có trong nút đó,

dụ:

giả mã này:

<xsl:template match="MyElement"> 
    <xsl:call-template name="XYZ"/> 
</xsl:template> 

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

Đoạn mã trên là tốt như viết :

<xsl:template match="MyElement"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Bạn cũng có thể sử dụng vòng lặp for-each trong mẫu được gọi. :)

Nhưng chỉ cần chắc chắn bạn chính xác ở đâu ..

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