2012-10-03 24 views
13

Mẫu sắc trông như thế này:Lựa chọn mặc định của các mẫu áp dụng XSLT là gì?

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

Liệu <xsl:apply-templates select="@*|node()" /> chọn hơn <xsl:apply-templates />, hoặc có thể các mẫu bản sắc đã được như thế này?

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

Chính xác những gì được chọn khi tôi làm như sau?

<xsl:apply-templates /> 

Trả lời

16

Liệu <xsl:apply-templates select="@*|node()" /> chọn hơn <xsl:apply-templates />, hoặc có thể các mẫu sắc đã như thế này?

<xsl:apply-templates/> 

tương đương với:

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

và đây là một cựu ngắn hơn:

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

và đây là một tương đương với:

<xsl:apply-templates select="* | text() | comment() | processing-instruction()"/> 

Như chúng tôi se e từ hướng dẫn trước, xsl:apply-templates hướng dẫn bạn đang hỏi về, không chọn bất kỳ thuộc tính, do đó nó không thể được sử dụng như một cách viết tắt cho:

<xsl:apply-templates select="@*|node()"/> 
+0

@OP: P.S. điều này được định nghĩa tại http://www.w3.org/TR/xslt#section-Applying-Template-Rules: "Trong trường hợp không có thuộc tính select, lệnh xsl: apply-templates xử lý tất cả các phần tử con của dòng nút, bao gồm các nút văn bản. ... "Lưu ý rằng các nút thuộc tính là * not * được coi là con của phần tử gốc của chúng. – LarsH

+0

@LarsH, Có, nhưng đôi khi độc giả thấy trích dẫn thông số là "đáng sợ" :) –

+0

Vâng, nếu tôi phải chọn giữa chỉ trích dẫn Spec và chỉ giải thích ý nghĩa của nó, tôi sẽ chọn câu trả lời của bạn (trừ khi tôi nghĩ ý nghĩa của spec là rất dễ hiểu vào thời điểm này).Tuy nhiên, kết hợp với một lời giải thích hữu ích, tôi nghĩ rằng việc chỉ người dùng đến tài liệu chính sẽ giúp họ "học cách câu cá". OP ở đây dường như là một lập trình viên hoàn thành, người không nên sợ spec. :-) – LarsH

4

Lựa chọn mặc định cho <xsl:apply-templates/> chỉ là "node()", không bao gồm thuộc tính.

+0

Ah, sau đó tạo cảm giác hoàn hảo sau đó :) – Svish

1

Các default selection of apply-templatesnode(), mà là viết tắt cho child::node(). Biểu thức XPath này được đánh giá như sau:

  • Đầu tiên, tất cả các nút từ "con" axis được lấy. Đây là tất cả các con trực tiếp của phần tử hiện tại, tức là các phần tử, văn bản và nhận xét khác, nhưng không phải là các thuộc tính.
  • Sau đó, bộ nút này được lọc bằng nút node test "()". Trong trường hợp này, không có phần tử nào được lọc vì thử nghiệm đó khớp với mọi thứ.

Vì vậy, với <xsl:apply-templates />, mẫu cho các phần tử con được áp dụng nhưng không áp dụng cho các thuộc tính. Trong trường hợp mẫu bản sao này có nghĩa là các thuộc tính không được sao chép.

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