<xsl:sequence>
trên giá trị nguyên tử (hoặc chuỗi giá trị nguyên tử) giống như <xsl:copy-of>
cả hai chỉ trả về bản sao đầu vào của chúng. Sự khác biệt xuất hiện khi bạn xem xét các nút.
Nếu $ n là một nút phần tử duy nhất, ví dụ như theo định nghĩa của một cái gì đó giống như
<xsl:variable name="n" select="/html"/>
Sau đó
<xsl:copy-of select="$n"/>
Trả về một bản sao của nút, nó có tên và con cùng cấu trúc nhưng đó là một nút mới có nhận dạng mới (và không có cha mẹ).
<xsl:sequence select="$n"/>
Trả về nút $ n, Nút được trả lại có cùng giá trị gốc là $ n và bằng với toán tử Xpath is
.
Sự khác biệt gần như hoàn toàn đeo mặt nạ trong truyền thống (XSLT 1 phong cách) mẫu sử dụng như bạn không bao giờ được tiếp cận với các kết quả của một trong hai hoạt động là kết quả của các nhà xây dựng là ngầm sao chép vào cây đầu ra nên thực tế là xsl:sequence
doesn 't làm một bản sao được đeo mặt nạ.
<xsl:template match="a">
<x>
<xsl:sequence select="$n"/>
</x>
</xsl:template>
cũng giống như
<xsl:template match="a">
<x>
<xsl:copy-of select="$n"/>
</x>
</xsl:template>
Cả hai tạo ra một nút phần tử mới và sao chép kết quả của các nội dung như con của nút mới x
.
Tuy nhiên, sự khác biệt sẽ nhanh chóng được nhìn thấy nếu bạn sử dụng các chức năng.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="data:,f">
<xsl:variable name="s">
<x>hello</x>
</xsl:variable>
<xsl:template name="main">
::
:: <xsl:value-of select="$s/x is f:s($s/x)"/>
:: <xsl:value-of select="$s/x is f:c($s/x)"/>
::
:: <xsl:value-of select="count(f:s($s/x)/..)"/>
:: <xsl:value-of select="count(f:c($s/x)/..)"/>
::
</xsl:template>
<xsl:function name="f:s">
<xsl:param name="x"/>
<xsl:sequence select="$x"/>
</xsl:function>
<xsl:function name="f:c">
<xsl:param name="x"/>
<xsl:copy-of select="$x"/>
</xsl:function>
</xsl:stylesheet>
Tạo
$ saxon9 -it main seq.xsl
<?xml version="1.0" encoding="UTF-8"?>
::
:: true
:: false
::
:: 1
:: 0
::
Đây là kết quả của xsl:sequence
và xsl:copy-of
là hoàn toàn khác nhau.
trong ví dụ thứ hai, điều đó có nghĩa là xsl: trình tự tốt hơn cho hiệu suất không? Vậy thì, đâu là lợi thế của bản sao trên xsl: sequence? – user3813234
Tôi nghi ngờ có rất ít trường hợp bạn thực sự cần xsl: copy-of. Trừ khi bạn sử dụng validation = strict hoặc copy-namespaces = no, có lẽ. Trong hầu hết trường hợp, việc sử dụng xsl: copy-of thay vì xsl: sequence sẽ vô hại nhưng chắc chắn có một số trường hợp nó có thể gây ra việc sao chép không cần thiết và tốn kém trừ khi trình tối ưu hóa đủ thông minh để ngăn chặn nó. Nhưng trong ví dụ trên, cả hai không tương đương: $ x/.. trả về không có gì nếu bạn tạo bản sao, nhưng trả về cha mẹ của các nút gốc nếu bạn chọn chúng bằng xsl: sequence. –
aah Tôi hiểu rồi. Cảm ơn rất nhiều! – user3813234