2012-01-19 35 views
14

Có thể gán giá trị cho tham số của biểu định kiểu đã nhập không?Tham số biểu định kiểu XSLT trong biểu định kiểu đã nhập

Tôi đã chờ đợi một cái gì đó giống như

<xsl:import ... > 
    <xsl:with-param ... 
</xsl:import> 

nhưng điều đó không được phép.

Ngoài ra đường hầm = "có" bị cấm trong thông số biểu định kiểu.

+0

Đôi khi bạn có thể sử dụng thực tế rằng nếu một mẫu trong trang tính được nhập sử dụng các thông số bạn có thể gọi nó với các tham số từ biểu định kiểu nhập. –

Trả lời

17

Hãy thử điều này:

main.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:import href="import.xsl"/> 

    <xsl:variable name="param" select="'some-value'"/> 

    <xsl:template match="/"> 
    <xsl:call-template name="foo"/>  
    </xsl:template> 

</xsl:stylesheet> 

import.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:param name="param" select="'default'"/> 

    <xsl:template name="foo"> 
    <out><xsl:value-of select="$param"/></out>  
    </xsl:template> 

</xsl:stylesheet> 

Một xsl: variable trong một stylesheet nhập khẩu có thể ghi đè lên một xsl: param trong một stylesheet nhập khẩu, và điều này có hiệu quả đặt giá trị của tham số.

+0

FYI, từ thử nghiệm thực nghiệm của tôi, trong biểu định kiểu nhập, bạn có thể ghi đè thông số bằng cách sử dụng hoặc . – Archie

4

Nhìn lướt qua các thông số kỹ thuật cho thấy không có cấu trúc như vậy được phép:

Nói tóm lại, href là thuộc tính chỉ được phép và không có nội dung nào được phép trong phần tử của phần tử.

Tuy nhiên, nếu tôi hiểu trường hợp sử dụng của bạn, thì bạn chỉ cần đặt tham số theo cách thông thường (sử dụng ngôn ngữ máy chủ của bạn). Nó không thực sự quan trọng là nó được định nghĩa trong bản định kiểu đã nhập. Ví dụ, giả sử bạn có kiểu này:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="import.xsl"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="$test"/> 
    </xsl:template> 
</xsl:stylesheet> 

nào nhập khẩu này:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="test" select="'default'"/> 
</xsl:stylesheet> 

... sau đó thiết lập các thông số test theo cách thông thường nên chỉ làm việc. Lưu ý rằng bạn cũng có thể "mặt nạ" tham số từ trang tính đã nhập nếu bạn muốn cung cấp giá trị mặc định mới.

Vì vậy, bổ sung này để stylesheet đầu tiên:

<xsl:param name="test" select="'default2'"/> 

... sẽ gây ra nó để in default2 (overriding mặc định từ bảng nhập khẩu).

1

Chỉ cần thêm vào câu trả lời tuyệt vời của lwburk (+1), đây là một ví dụ khác về gán giá trị cho tham số trong biểu định kiểu đã nhập.

Bạn sẽ không cần thêm xsl:param vào biểu định kiểu chính; bạn sẽ chỉ gán giá trị khi bạn gọi biểu định kiểu (ví dụ như trên dòng lệnh).

main.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:import href="import.xsl"/> 

    <xsl:template match="/"> 
    <xsl:call-template name="foo"/>  
    </xsl:template> 

</xsl:stylesheet> 

import.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:param name="param" select="'default'"/> 

    <xsl:template name="foo"> 
    <out><xsl:value-of select="$param"/></out>  
    </xsl:template> 

</xsl:stylesheet> 

dụ saxon dòng lệnh (thiết lập giá trị tham số mới)

java -cp "saxon9.jar" net.sf.saxon.Transform -s:input.xml -xsl:main.xsl -o:output.xml param="kuba" 

Đầu ra .xml

<out>kuba</out> 
2

Có lẽ đây cũng là hữu ích:

Trong XSLT 2.0 ai có thể truyền tham số cho một mẫu overriden trong một stylesheet nhập khẩu và nhanh chóng nó từ mẫu trọng sử dụng: <xsl:apply-imports>.

Tham số truyền với <xsl:apply-imports> là tính năng chỉ có trong XSLT 2.0 - điều này không thể thực hiện được trong XSLT 1.0.

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