2014-12-19 20 views
5

Đã trả lời một số lượng lớn các câu hỏi XSLT tại đây trên Stack Overflow, tôi đã quen hơn với kỹ thuật nhóm Muenchian để nhóm các nút trong quá trình chuyển đổi XSL.[1] trong nhóm Muenchian có thực sự cần thiết không?

Khái niệm sử dụng trong đó thường là một cái gì đó như thế này:

*[generate-id() = 
    generate-id(key('kSomeKey', .)[1])] 

Nó hầu như luôn chứa rằng [1], nhưng điều này đã luôn luôn cho tôi cảm thấy kỳ lạ.

Các XSLT 1.0 đặc tả định nghĩa generate-id() như sau:

Chức năng generate-id trả về một chuỗi xác định duy nhất nút trong đối số node-set đó là đầu tiên theo thứ tự tài liệu.

(nhấn mạnh thêm)

Nó nêu rõ rằng các chức năng hoạt động trên nút đầu tiên theo thứ tự tài liệu, và trong bối cảnh này, các [1] sẽ được chọn nút đầu tiên trong tập hợp theo thứ tự tài liệu, vì vậy có vẻ như là [1] là không cần thiết.

[1] được sử dụng rộng rãi đến mức tôi lưỡng lự để bỏ qua nó, nhưng dường như không liên quan. Có ai có thể dọn dẹp nó cho tôi không?

+2

Nó sẽ là cần thiết trong XSLT 2.0, vì 'generate-id' không cho phép một bộ nút làm đối số đầu tiên trong đó, và ném một lỗi. Tất nhiên, nếu bạn đang sử dụng XSLT 2.0, bạn sẽ có nhiều khả năng sử dụng 'xsl: for-each-group' hơn là Muenchian Grouping. –

Trả lời

2

Ngữ nghĩa [1] là không cần thiết nhưng tùy thuộc vào (thiếu) tối ưu hóa trong bộ xử lý XSLT nó có thể hiệu quả hơn để có nó. Nó sẽ phụ thuộc vào nội bộ của mỗi bộ xử lý XSLT cho dù key('key-name', foo)[1] chỉ tính toán một nút hoặc đầu tiên tính toán tập hợp nút với tất cả các nút được chọn bởi khóa và sau đó lấy đầu tiên nhiều tùy thuộc vào bộ xử lý XSLT để nhận dạng generate-id(key('key-name', foo)). trong đó chỉ có nút đầu tiên trong tập hợp nút được tính bằng khóa là cần thiết.

+0

Cảm ơn! Điều này có vẻ như là một lý do hợp lý để tiếp tục sử dụng nó. – JLRishe

4

Tôi khuyên bạn nên luôn sử dụng "[1]" rõ ràng hơn là khai thác thực tế rằng các hoạt động trong XPath 1.0 thực hiện điều đó một cách ngầm định. Vì hai lý do: nó cải thiện khả năng đọc mã của bạn và nó làm cho nó tương thích với XPath 2.0. Có thể có các bộ vi xử lý mà nó mang lại một lợi ích hiệu suất, nhưng tôi sẽ không suy đoán về điều đó cho đến khi nó được chứng minh bằng phép đo.

+0

Cảm ơn! (+1) Tôi không chắc chắn rằng tôi đồng ý rằng nó cải thiện khả năng đọc, nhưng khả năng tương tác luôn luôn là một mục tiêu tốt để có. – JLRishe

+0

@JLHãy trả lời cho một người ít quen thuộc hơn với các thông số XPath và XSLT tôi cho rằng '[1]' không cải thiện khả năng đọc. Nó làm cho nó tinh thể rõ ràng rằng bạn muốn kiểm tra xem nút này là nút đầu tiên trong nhóm của nó hay không và làm cho nó rõ ràng những gì để tinh chỉnh nếu bạn muốn kiểm tra thứ hai/thứ ba/cuối cùng trong nhóm thay vì đầu tiên. –

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