2008-12-06 31 views
22

Tôi có một số mẫu khớp với các nút khác nhau trong tài liệu xml. Nếu tôi chỉ cần
< xsl: apply-templates /> , bằng cách nào đó, kết quả đầu ra đệ quy văn bản của tất cả các nút bên dưới. Tôi chỉ muốn nó đệ quy phù hợp với bất kỳ mẫu nào tôi đã xác định. Làm thế nào để làm điều đó ?Làm cách nào để xsl: apply-templates chỉ khớp các mẫu mà tôi đã xác định?

Trả lời

37

này đang xảy ra vì trong số các mẫu được tích hợp trong XSLT. XSLT có một vài được xây dựng trong các mẫu, mà nói:

  • khi bạn áp dụng các mẫu để một phần tử, quá trình phần tử con của nó
  • khi bạn áp dụng các mẫu để một nút văn bản, cung cấp cho giá trị của nó

Cùng với nhau, điều đó có nghĩa là nếu bạn áp dụng mẫu cho một phần tử nhưng không có mẫu rõ ràng cho phần tử đó, thì nội dung của nó được xử lý và cuối cùng bạn kết thúc với văn bản rằng phần tử chứa.

Đọc toàn bộ lời giải thích ở đây: http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

Bạn có thể thay thế template mặc định cho nút văn bản bằng cách định nghĩa mẫu của riêng bạn và có nó không làm gì cả.

<xsl:template match="text()" /> 
+1

Nếu trong XSLT 2.0 và sử dụng chế độ mẫu, nó có thể hữu ích để sử dụng ''. Nếu không, mẫu văn bản mặc định sẽ vẫn áp dụng nếu bạn ví dụ như ''. – Svish

2

bạn có thể thiết lập một chế độ để chỉ áp dụng mẫu của riêng bạn:

<xsl:template match="* | /" > 
    <xsl:apply-templates mode="myMode" /> 
</xsl:template> 

<xsl:template match="somenode" mode="myMode"> 
    <!-- do something here --> 
</xsl:template> 

Một lựa chọn khác sẽ được ghi đè được xây dựng trong các quy tắc mẫu (xem ví dụ http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm)

24

Đây có lẽ là vấn đề thường gặp nhất đối với người lập trình XSLT.

Hành vi được quan sát chính xác là cách xử lý tuân thủ XSLT.

Đi vào tài khoản đó:

        <xsl:apply-templates/>

là viết tắt cho:

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

và sự tồn tại của built-in các quy tắc mẫu. Theo XSLT 1.0 Spec:.

"5,8 Built-in Rules Template

Có một built-in mẫu quy tắc để cho phép xử lý đệ quy để tiếp tục trong sự vắng mặt của một mô hình phù hợp thành công bởi một quy tắc mẫu rõ ràng Quy tắc mẫu này áp dụng cho cả nút phần tử và nút gốc.Sau đây cho thấy tương đương với built-in mẫu quy tắc:

 
<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

Ngoài ra còn có một built-in mẫu quy định đối với từng chế độ, cho phép xử lý đệ quy để tiếp tục ở chế độ tương tự trong sự vắng mặt của một mô hình thành công khớp với quy tắc mẫu rõ ràng trong biểu định kiểu. Quy tắc mẫu này áp dụng cho cả nút phần tử và nút gốc. Phần sau đây cho thấy tương đương với quy tắc mẫu dựng sẵn cho chế độ m.

 
<xsl:template match="*|/" mode="m"> 
    <xsl:apply-templates mode="m"/> 
</xsl:template>

Ngoài ra còn có một built-in quy tắc mẫu cho văn bản và thuộc tính nút cho phép sao chép văn bản thông qua:

 
<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Việc xây dựng trong mẫu quy định để được hướng dẫn chế biến và bình luận là không làm gì cả.

 
<xsl:template match="processing-instruction()|comment()"/> 

Quy tắc mẫu được tạo sẵn cho các nút không gian tên cũng không làm gì cả. Không có mẫu nào có thể khớp với nút không gian tên; do đó, quy tắc mẫu dựng sẵn là quy tắc mẫu duy nhất được áp dụng cho các nút không gian tên.

Việc xây dựng trong quy tắc mẫu được đối xử như thể chúng được nhập khẩu ngầm trước khi stylesheet và do đó có thấp hơn nhập khẩu ưu tiên hơn tất cả các quy tắc mẫu khác. Do đó, tác giả có thể ghi đè lên một built-in mẫu quy tắc bằng cách bao gồm một mẫu quy tắc rõ ràng "

--- End của XSLT Spec quote ---

Vì vậy, nếu tác giả muốn trở thành kiểm soát hoàn toàn quá trình xử lý XSLT, chúng phải ghi đè lên tất cả các mẫu được tích hợp sẵn.

Ví dụ, nếu chúng ta không muốn sao chép các đầu ra, chúng tôi có thể khiến chúng bị bỏ qua bằng cách ghi đè -in mẫu theo cách sau:

        <xsl:template match="text()" />

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