2012-01-12 25 views
8

VớiVariable trong xsl: template phù hợp với mô hình

Một kiểu XSLT với một biến toàn cầu:

<xsl:variable name="lang" select="/response/str[@name='lang']"/> 

Câu hỏi

đâu xa đến giới hạn rằng việc sử dụng các biến trong các vị từ là không chính xác trong mẫu phù hợp với xsl:template, nhưng có thể chấp nhận được trong xsl:apply-templates chọn mẫu?

<!-- throws compilation error, at least in libxslt --> 
<xsl:template match="list[@name='item_list'][$lang]"/> 

<!-- works as expected --> 
<xsl:template match="list[@name='item_list'][/response/str[@name='lang']]"/> 

<!-- works as expected --> 
<xsl:template match="response"> 
    <xsl:apply-templates select="list[@name='item_list'][$lang]"> 
</xsl:template> 
+0

Tôi không chắc đó là giới hạn, nhưng bạn có chắc '$ lang' của bạn chứa giá trị chuỗi (hoặc số) nhưng không phải là một số nút được đặt không? – YuS

+0

@yuri, nó chứa tập hợp nút, nhưng tôi không thấy lý do tại sao tập hợp nút không được phép trong ngữ cảnh. – newtover

+1

Tôi không thể cho bạn biết chi tiết về lý do hạn chế được chỉ định trong XSLT 1.0 nhưng tôi có thể cho bạn biết rằng nó đã biến mất trong XSLT 2.0, vì vậy bạn có thể cân nhắc chuyển sang phiên bản ngôn ngữ đó và một trong các phiên bản của nó Saxon 9 hoặc AltovaXML. –

Trả lời

10

Biến không được phép sử dụng trong biểu thức khớp trong XSLT 1.0.

Từ XSLT 1.0 đặc điểm kỹ thuật: Defining Template Rules

Đây là một lỗi cho giá trị của thuộc tính phù hợp để chứa một VariableReference .

Các biến được phép trong biểu thức khớp trong XSLT 2.0.

Từ XSLT 2.0 đặc điểm kỹ thuật: Syntax of Patterns

Patterns có thể bắt đầu với một id FO hoặc gọi số chức năng quan trọng, miễn là giá trị để được xuất hiện được cung cấp như một trong hai một chữ hay một tham chiếu cho một biến hoặc tham số, và tên khóa (trong trường hợp chức năng khóa ) được cung cấp dưới dạng chuỗi ký tự. Những mẫu này sẽ không bao giờ khớp với một nút trong cây có gốc không phải là nút tài liệu.

+0

Cảm ơn! Ngay trước khi hỏi tôi nhìn chính xác phần đó của spec, nhưng bằng cách nào đó đã bỏ qua câu bạn trích dẫn. Tôi cần ngủ ngon hơn! – newtover

+1

@newtover: P.S. bạn cũng hỏi tại sao một tham chiếu biến "được chấp nhận trong mẫu chọn xsl: apply-templates". Câu trả lời là việc chọn trong 'xsl: apply-templates' không phải là một mẫu mà là một biểu thức XPath. Các mẫu trông rất giống với các biểu thức XPath nhưng chúng không giống nhau. Giới hạn tham chiếu biến này là một khác biệt (trong XSLT 1.0). – LarsH

+0

Rất tiếc, tôi không nghĩ rằng tuyên bố của bạn về thời điểm các biến được cho phép trong biểu thức đối sánh là khá chính xác, dựa trên việc đọc thông số của tôi. Tôi nghĩ bạn chỉ có thể nói "Các biến được cho phép trong các biểu thức khớp trong XSLT 2.0" ngay cả khi chúng tham chiếu đến một nút tài liệu.Nó chỉ là các mẫu chứa các hàm gọi hàm key() và id() sẽ không bao giờ khớp với một nút trong cây có gốc không phải là nút tài liệu ... nhưng điều đó không giới hạn giá trị của biến trong mẫu có thể là gì. – LarsH

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