2011-05-10 23 views
8

CẬP NHẬT 17.Jul.2013:
XALAN 2.7không cachedocument() cuộc gọi trong vòng một yêu cầu. Vì vậy, điều quan trọng là lưu trữ từng tài liệu cần thiết trong một biến trong XSL.Tài liệu XSLT(): Có chậm hơn khi gọi nó nhiều lần không?


Tôi đã tìm kiếm cho khá trong một và không tìm thấy câu trả lời cụ thể cho câu hỏi đơn giản của tôi:

Những cách tiếp cận nhanh hơn hay là trình biên dịch "thông minh" đủ để cả hai biến thể đều giống nhau ?

Lưu ý: Tôi đang sử dụng Xalan (thực hiện mặc định trong JDK 1.6) 2,7:

1) Tôi có đọc một tài sản trong một XML bên ngoài:

<xsl:value-of select="document($path)/person/address/city"/> 

Bất cứ khi nào tôi cần thành phố, tôi sử dụng biểu thức ở trên (giả sử 100 lần)

2) Thay vì gọi tài liệu() 100 lần, tôi lưu trữ nút XML trong một biến:

<xsl:variable name="node" select="document($path)"/> 

Và sau đó tôi sử dụng 100 lần

<xsl:value-of select="$node/person/address/city"/> 

Cái nào nhanh hơn, tốt hơn, mà lý do? Cảm ơn bạn!

+0

Tôi cũng bị đặt trong câu trả lời của chuyên gia, nhưng, như tôi nghĩ, trường hợp có nhiều lệnh 'tài liệu (path_to_doc)' phụ thuộc vào việc thực hiện bộ nhớ đệm xslt, trong trường hợp khi nút tài liệu được lưu trữ trong biến nó phải được nạp một lần trong mọi trường hợp. –

+0

Vâng, tôi cũng đoán rằng nó ** phụ thuộc vào việc thực hiện ** của bộ vi xử lý, nhưng tôi tò mò như thế nào ** Xalan 2.7 (bộ xử lý mặc định trong JDK 1.6) ** hiện nó. – basZero

+0

Tôi không phải là 100% tích cực nhưng tôi nghĩ Xalan không cache 'tài liệu()' kết quả, nhưng xsltproc nào. Tuy nhiên, đối số 'document()' được hiểu là một URI ([xem spec] (http://www.w3.org/TR/xslt#add-func)), do đó một bộ nhớ đệm tích cực sẽ có ý nghĩa hoàn hảo. –

Trả lời

3

Cả hai phương pháp nên thực thi cùng một lúc nếu bộ xử lý XSLT không ngây thơ, vì hàm tài liệu sẽ trả về cùng kết quả khi được gọi với cùng một đối số, bất kể số lần.

Cả hai phương pháp đều không hiệu quả, do việc sử dụng chữ viết tắt //, làm cho toàn bộ cây tài liệu được duyệt qua.

Tôi muốn giới thiệu sau khi hiệu quả hơn cả hai phương pháp đang được thảo luận:

<xsl:variable name="vCities" select="document($pUrl)//cities"/> 

sau đó chỉ tham khảo$vCities.

Bằng cách này, bạn chỉ duyệt tài liệu một lần.

+3

+1. Dimitre, bạn có thể cho tôi một tham chiếu cho quy tắc idempotence bạn đã đề cập? Tôi đã nghe nói rằng trước đây nhưng đã rất ngạc nhiên khi không nhìn thấy nó trong thông số kỹ thuật XSLT 1.0 hoặc 2.0. – LarsH

+0

@LarsH: Tôi cũng bị choáng ngợp - có thể ở trong tài liệu errata ở đâu đó ... –

+0

btw: '//' chỉ là một ví dụ và không nên là một phần của câu hỏi của tôi, xin lỗi! trọng tâm là trên hàm 'document()'. Vì vậy, tôi vẫn không chắc liệu nó có tạo nên sự khác biệt trong ** XALAN 2.7 ** hay không! – basZero

2

Dường như bạn hiểu các nguyên tắc liên quan, vì vậy bạn không cần bất kỳ giải thích nào ở đó.

Nếu bạn muốn biết Xalan 2.7 hoạt động như thế nào, câu trả lời cuối cùng sẽ được tìm thấy bằng cách kiểm tra bằng Xalan 2.7, với thử nghiệm đủ lớn.

Như @Dimitre lưu ý, không phải một trong số này nhất thiết phải hiệu quả, bởi vì //, mặc dù một số bộ xử lý thông minh về việc tối ưu hóa các loại đường dẫn đó, giảm thiểu vấn đề.Bạn có thể giúp bộ vi xử lý có hiệu quả hơn bằng cách giữ các yếu tố city trong một biến:

<xsl:variable name="city" select="(document($path)//city)[1]"/> 
... 
<xsl:value-of select="$city"/> 

tôi thêm [1] trong đó để tối ưu hóa hơn nữa bởi vì bạn nói "thành phố" (tức là bạn mong đợi chỉ có một), và điều này cho phép một bộ xử lý thông minh dừng lại sau khi nó tìm thấy phần tử city đầu tiên.

+0

+1 để có câu trả lời đúng. –

+0

Cuộc thảo luận không phải là về '//', tôi đã xóa nó khỏi ví dụ. Tôi sẽ kiểm tra 'document()' bằng cách cố gắng xem các yêu cầu trong nhật ký cho mọi lệnh 'document()'. Nhưng trước khi đầu tư thời gian vào điều này, tôi nghĩ ai đó ở đây sẽ biết điều đó (từ mã nguồn). – basZero

+0

Bất cứ ai quan tâm để giải thích lý do tại sao downvote? Không biết nếu đó là từ @bas – LarsH

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