2010-10-18 54 views
8

Sự khác nhau giữa <xsl:apply-templates /><xsl:apply-templates select="." /> là gì. Tôi nghĩ rằng select="." là không cần thiết, nhưng tôi nhận được kết quả khác nhau tùy thuộc vào việc tôi sử dụng.Sự khác nhau giữa <xsl: apply-templates /> và <xsl: apply-templates select = "." />

Xin lỗi nếu đây là lần lặp lại. Tôi đã thử tìm kiếm vấn đề này nhưng không thể tìm thấy bất cứ điều gì.

+2

Câu hỏi hay, +1. Xem câu trả lời của tôi cho một lời giải thích chi tiết về sự khác biệt b/n hai hướng dẫn và cũng cho một cảnh báo. :) –

Trả lời

18

sự khác biệt giữa <xsl:apply-templates /><xsl:apply-templates select="." />

Các hướng dẫn đầu tiên là gì:

<xsl:apply-templates /> 

là viết tắt của:

<xsl:apply-templates select="child::node()" /> 

Lệnh thứ hai:

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

là viết tắt của:

<xsl:apply-templates select="self::node()" /> 

Như chúng ta thấy, không chỉ có hai hướng dẫn đây là những khác nhau (cựu áp dụng các mẫu để tất cả các nút con và sau đó áp dụng mẫu cho nút hiện tại), nhưng sau đó là nguy hiểm và thường có thể dẫn đến một vòng lặp vô tận!

+1

+1 Giải thích tốt hơn. –

+0

hah, cảm ơn! Điều đó sẽ giải thích lỗi tràn ngăn xếp của tôi. – joe

4

Were bạn nghĩ đến việc chênh lệch giữa

<xsl:apply-templates /> 

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

? Lý do tôi hỏi là <xsl:apply-templates select="." /> là rất không phổ biến, trong khi <xsl:apply-templates select="*" /> là rất phổ biến.

Khi chọn giữa hai phương án này, select="*" thường không cần thiết, nhưng có một sự khác biệt:

  • Như Dimitre chỉ ra, <xsl:apply-templates /> mà không có một chọn sẽ xử lý tất cả các con nút. Điều này bao gồm các nhận xét, hướng dẫn xử lý và hầu hết đáng chú ý, văn bản nút, cũng như yếu tố con.
  • Ngược lại, <xsl:apply-templates select="*" /> sẽ chỉ chọn các nút con yếu tố.

Vì vậy, nếu XML đầu vào có thể có nút con ngoài phần tử và bạn không muốn xử lý các nút đó, thì <xsl:apply-templates select="*" /> là những gì bạn muốn.

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