Helpex - Trao đổi & giúp đỡ Đăng nhập
112

Tôi là người mới trong XSLT nên tôi hơi bối rối về hai thẻ,

<xsl:apply-templates name="nodes">

<xsl:call-template select="nodes"> 

Vì vậy, bạn có thể liệt kê ra sự khác biệt giữa chúng?

112 hữu ích 0 bình luận 94k xem chia sẻ
150

<xsl:call-template> gần giống với việc gọi một hàm trong ngôn ngữ lập trình truyền thống.

Bạn có thể định nghĩa các hàm trong XSLT, như hàm đơn giản này tạo ra một chuỗi.

<xsl:template name="dosomething">
  <xsl:text>A function that does something</xsl:text>
</xsl:template>

Chức năng này có thể được gọi thông qua <xsl:call-template name="dosomething">.

<xsl:apply-templates>có một chút khác biệt và trong đó là sức mạnh thực sự của XSLT: Nó cần bất kỳ số lượng nút XML nào (bất cứ điều gì bạn xác định trong selectthuộc tính), lặp lại chúng ( điều này rất quan trọng: các mẫu áp dụng hoạt động như một vòng lặp! ) và tìm thấy các mẫu phù hợp cho họ:

<!-- sample XML snippet -->
<xml>
  <foo /><bar /><baz />
</xml>

<!-- sample XSLT snippet -->
<xsl:template match="xml">
  <xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>

<xsl:template match="foo"> <!-- will be called once -->
  <xsl:text>foo element encountered</xsl:text>
</xsl:template>

<xsl:template match="*"> <!-- will be called twice -->
  <xsl:text>other element countered</xsl:text>
</xsl:template>

Bằng cách này, bạn từ bỏ một chút kiểm soát đối với bộ xử lý XSLT - không phải bạn quyết định luồng chương trình đi đâu, mà là bộ xử lý thực hiện bằng cách tìm sự phù hợp nhất cho nút mà nó hiện đang xử lý.

Nếu nhiều mẫu có thể khớp với một nút, thì mẫu có biểu thức khớp cụ thể hơn sẽ thắng. Nếu có nhiều mẫu phù hợp với cùng độ đặc hiệu tồn tại, mẫu được khai báo cuối cùng sẽ thắng.

Bạn có thể tập trung hơn vào việc phát triển các mẫu và cần ít thời gian hơn để làm "hệ thống ống nước". Các chương trình của bạn sẽ trở nên mạnh mẽ hơn và được mô đun hóa, ít lồng sâu hơn và nhanh hơn (vì bộ xử lý XSLT được tối ưu hóa để khớp mẫu).

Một khái niệm cần hiểu với XSLT là "nút hiện tại". Với <xsl:apply-templates>nút hiện tại di chuyển với mỗi lần lặp, trong khi <xsl:call-template>không thay đổi nút hiện tại. Tức là .bên trong một mẫu được gọi tham chiếu đến cùng một nút như .trong mẫu gọi. Đây không phải là trường hợp với các mẫu áp dụng.

Đây là sự khác biệt cơ bản. Có một số khía cạnh khác của các mẫu ảnh hưởng đến hành vi của chúng: Chúng modeprioritythực tế là các mẫu có thể có cả a namevà a match. Nó cũng có tác động cho dù mẫu đã được nhập ( <xsl:import>) hay chưa. Đây là những sử dụng nâng cao và bạn có thể đối phó với chúng khi bạn đến đó.

150 hữu ích 5 bình luận chia sẻ
15

Để thêm vào câu trả lời hay của @Tomalak:

Dưới đây là một số khác biệt không đề cập và quan trọng :

  1. xsl:apply-templatesphong phú hơn và sâu hơn xsl:call-templatesvà thậm chí từ xsl:for-each, đơn giản vì chúng ta không biết mã nào sẽ được áp dụng trên các nút của lựa chọn - trong trường hợp chung, mã này sẽ khác nhau đối với các nút khác nhau của danh sách nút.

  2. Mã sẽ được áp dụng có thể được viết theo cách sau khi xsl:apply templates được viết và bởi những người không biết tác giả gốc.

Việc triển khai các hàm bậc cao (HOF) trong thư viện FXSL trong XSLT sẽ không thể thực hiện được nếu XSLT không có <xsl:apply-templates>hướng dẫn.

Tóm tắt : Mẫu và <xsl:apply-templates>hướng dẫn là cách XSLT thực hiện và xử lý đa hình.

Tham khảo : Xem toàn bộ chủ đề này: http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html

15 hữu ích 0 bình luận chia sẻ
6

xsl:apply-templatesthường (nhưng không nhất thiết) được sử dụng để xử lý tất cả hoặc một tập hợp con của nút hiện tại với tất cả các mẫu áp dụng. Điều này hỗ trợ tính đệ quy của ứng dụng XSLT phù hợp với tính đệ quy (có thể) của XML được xử lý.

xsl:call-templatemặt khác giống như một cuộc gọi chức năng bình thường. Bạn thực hiện chính xác một mẫu (được đặt tên), thường có một hoặc nhiều tham số.

Vì vậy, tôi sử dụng xsl:apply-templatesnếu tôi muốn chặn việc xử lý một nút thú vị và (thường) tiêm thứ gì đó vào luồng đầu ra. Một ví dụ điển hình (đơn giản hóa) sẽ là

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

trong khi đó với xsl:call-templatetôi thường giải quyết các vấn đề như thêm văn bản của một số mã con lại với nhau, chuyển đổi các nút được chọn thành văn bản hoặc các nút khác và tương tự - bất cứ điều gì bạn sẽ viết một hàm chuyên dụng, có thể tái sử dụng.

Chỉnh sửa:

Là một nhận xét bổ sung cho văn bản câu hỏi cụ thể của bạn:

<xsl:call-template name="nodes"/> 

Cái này gọi một mẫu có tên là 'nút':

    <xsl:template name="nodes">...</xsl:template>

Đây là một ngữ nghĩa khác với:

<xsl:apply-templates select="nodes"/>

... áp dụng tất cả các mẫu cho tất cả các con của nút XML hiện tại của bạn có tên là 'nút'.

6 hữu ích 0 bình luận chia sẻ
2

Các chức năng thực sự tương tự (ngoài ngữ nghĩa gọi, trong đó call-templateyêu cầu một namethuộc tính và một mẫu tên tương ứng).

Tuy nhiên, trình phân tích cú pháp sẽ không thực hiện theo cùng một cách.

Từ MSDN :

Không giống như <xsl:apply-templates>, <xsl:call-template>không thay đổi nút hiện tại hoặc danh sách nút hiện tại.

2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ xslt apply-templates , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading