Tôi hiện đang làm việc trên một bộ chuyển đổi XSL thuần túy với Bộ xử lý Saxon trong các phiên bản khác nhau. Dưới đây là stylesheet ngắn của tôi, đơn giản hóa cho nhu cầu của câu hỏi của tôi:Chức năng XSLT trả về các kết quả khác nhau [Saxon-EE vs Saxon-HE/PE]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:foo="bar">
<xsl:output encoding="UTF-8" method="text"/>
<xsl:template match="/">
<xsl:text>Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_2: </xsl:text>
<xsl:value-of select="foo:func_2()"/>
</xsl:template>
<xsl:function name="foo:func_1" as="xs:string">
<!-- do some other stuff -->
<xsl:value-of select="foo:func_2()"/>
</xsl:function>
<xsl:function name="foo:func_2" as="xs:string">
<xsl:variable name="node">
<xsl:comment/>
</xsl:variable>
<xsl:sequence select="generate-id($node)"/>
</xsl:function>
</xsl:stylesheet>
Mô tả
foo:func_1
là một hàm wrapper để trả về giá trị của một hàm thứ hai + làm công cụ khác, có thể được bỏ qua . khái niệm hàm này gọi hàm khác là bắt buộc!
foo:func_2
tạo id duy nhất cho một phần tử. Phần tử này được tạo ra trong một biến phạm vi cục bộ có tên là "nút".
khác nhau dựa trên các phiên bản Saxon
kết quả mong đợi:
Call of func_1: d2
Call of func_1: d3
Call of func_1: d4
Call of func_2: d5
Saxon-EE 9.6.0.7/Saxon-EE 9.6.0.5 Kết quả
Call of func_1: d2
Call of func_1: d2
Call of func_1: d2
Call of func_2: d3
Saxon-HE 9.6.0.5/Sax on-PE 9.6.0.5/Saxon-EE 9.5.1.6/Saxon-HE 9.5.1.6 dẫn
like expected
Câu hỏi/hơn nữa trong sâu
tôi sửa lỗi các vấn đề trên của riêng tôi như xa như tôi có thể. NẾU tôi sẽ thay đổi xsl:value-of
trong hàm "func_1" thành xsl:sequence
, kết quả sẽ giống nhau đối với tất cả các phiên bản [như mong đợi]. Nhưng đó không phải là ý định của tôi!
Tôi muốn hiểu sự khác biệt giữa xsl:value-of
và xsl:sequence
trong suốt các phiên bản Saxon là gì. Có bộ nhớ đệm "ẩn" nào không? Cách chính xác để làm việc với xsl:sequence
và xsl:value-of
trong trường hợp của tôi là gì. [btw: tôi biết rồi, giá trị tạo ra một nút văn bản với kết quả của câu lệnh chọn. chuỗi có thể là tham chiếu đến nút hoặc giá trị nguyên tử. đừng giải quyết vấn đề của tôi afaik]
Sự cố thú vị. Nhưng tôi không hiểu tại sao bạn viết các hàm được khai báo là trả về một chuỗi với 'as =" xs: string "', sau đó sử dụng 'xsl: value-of' trả về một nút văn bản (mà sau đó phải được đúc thành chuỗi để khớp với khai báo 'as'). –
Với Saxon 9.7 EE, nếu tôi tắt bất kỳ tối ưu hóa nào bằng cách sử dụng 'opt: 0' từ dòng lệnh, thì kết quả là một id khác nhau cho mỗi cuộc gọi. Vì vậy, có vẻ như EE đang thực hiện một số tối ưu hóa để thay đổi kết quả. –
Tôi nghĩ XSLT 3.0 cố gắng giải quyết vấn đề trong https://www.w3.org/TR/xslt-30/#function-determinism với thuộc tính 'new-each-time'. –