2009-04-10 20 views
6

Tôi nghe thấy thời gian và thời gian một lần nữa về cách bạn nên tránh sử dụng XSLT cho mỗi. Đó là con quỷ lập trình bên trong bắt buộc của bạn nên bị trục xuất.Có gì xấu về xsl: for-each?

Điều gì thật tệ?

Liệu vấn đề này có thực hành tốt nhất tùy thuộc vào kích thước của XML (tức là 100 so với 10.000 nút) không?

Trả lời

6

khác biệt khái quát giữa <xsl:apply-templates><xsl:-for-each> mà không ai đã chỉ ra:

  1. <xsl:apply-templates> thực sự là một cái gì đó nhiều hơn một đẹp hơn, tương đương thêm thanh lịch của <xsl:for-each>:

xsl:apply-templates là phong phú hơn và sâu hơn xsl:for-each, thậm chí chỉ đơn giản là vì chúng tôi 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.

Ngoài ra, mã mà sẽ được áp dụng có thể được viết cách sau xsl: apply template đã được viết và bởi người mà không biết tác giả ban đầu.


_2. Ở phía bên kia, sử dụng <xsl:for-each> sẽ không gây hại gì nếu bạn biết chính xác cách thức <xsl:for-each> được xử lý.

Vấn đề là rất nhiều người mới đến XSLT có kinh nghiệm trong lập trình bắt buộc mất <xsl:for-each> để thay thế "vòng lặp" trong PL yêu thích của họ và nghĩ rằng nó cho phép họ thực hiện điều không thể - như tăng bộ đếm hoặc bất kỳ sửa đổi nào khác đã được xác định là <xsl:variable>.

Sử dụng không thể thiếu <xsl:for-each> là thay đổi tài liệu hiện tại - điều này thường cần thiết in order to be able to use the key() function on a document, different from the current source XML document, ví dụ để truy cập bảng tra cứu hiệu quả nằm trong tài liệu xml của riêng nó.

2

Câu trả lời nhanh: XSLT phần lớn là chức năng trong tự nhiên và các vòng lặp bắt buộc không hoạt động.

Nói chung cách dựa để tận dụng tốt nhất của XSLT là sử dụng mô hình kết hợp càng nhiều càng tốt (xsl:apply-template hơn là vòng, IFS và call-template).

Cuối cùng, đó là tất cả về phong cách và sẽ tạo ra sự khác biệt nhỏ trong các đoạn ngắn của XSLT, nhưng hoạt động hiệu quả hơn sẽ giúp giải quyết các vấn đề dài/phức tạp hơn.

Khác với khi tạo hàm trả về giá trị thay vì sửa đổi đầu ra.

+0

Không có gì "bắt buộc" trong . Ngoài ra, bạn có ý nghĩa gì bởi "sử dụng mẫu"? Không có hướng dẫn như vậy trong XSLT. –

+0

s/sử dụng-mẫu/gọi-mẫu /: Typo – Richard

+0

looping (hoặc bất kỳ loại) là rất nhiều lĩnh vực lập trình bắt buộc. Chức năng một sẽ sử dụng đệ quy. – Richard

1

Bằng cách sử dụng apply-templates, có thể với một mode, giúp dễ dàng bao gồm các biến đổi thích hợp của nhiều loại yếu tố có thể được quan tâm tại vị trí đó.

Ví dụ nếu bạn có XML chứa nội dung thư viện và bạn tiếp tục sử dụng cho tất cả các địa điểm để chọn sách, thì bạn bắt đầu lưu giữ các bản ghi DVD, CD, bánh quy Gừng Nut, v.v. kiểm tra tất cả các phần cho từng phần để bao gồm nhiều hơn chỉ là sách. Nếu bạn đã sử dụng các mẫu ứng dụng, bạn có thể chỉ cần tạo các kết quả phù hợp mới cho các phần tử mới.

5

Mẫu có xu hướng chia nhỏ mã độc đáo hơn. Ngoài ra, cho mỗi vòng lặp phải chịu một thực tế là mọi người thường đến với họ với ý tưởng rằng họ hoạt động giống hệt với cách thức cho các vòng hoạt động trong các ngôn ngữ lập trình chính.

2

Đó là việc sử dụng for-each để gọi các mẫu không được khuyến khích, không sử dụng rộng rãi for-each, mỗi lần. Ngay cả Muenchian method of grouping cũng dựa trên các cấu trúc xsl:key với các vòng xsl:for-each.

Ý tưởng viết tốt XSLT là cấu trúc của XML của bạn nên quyết định những mẫu được khớp và sau đó được áp dụng. Do đó, bất cứ khi nào có thể, hãy sử dụng apply-templates để chọn các nút, thay vì áp dụng lựa chọn bằng cách sử dụng for-each.

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