2009-02-26 17 views
6

Tôi tìm thấy nó không thể có được với-param để làm việc với áp dụng các mẫu. Ví dụ, tôi đã hack các ví dụ được đưa ra trong w3schools.Tại sao tôi không thể lấy thông số để làm việc với các mẫu áp dụng trong XSL?

xsl

<xsl:template match="/"> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="cd"> 
    <xsl:param name="test"></xsl:param> 
    parameter: 
    <xsl:value-of select="$test"></xsl:value-of> 
</xsl:template> 

xml

<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

(Hy vọng), bạn sẽ thấy rằng các thông số kiểm tra không được chuyển cho template cd. Tôi có thể làm cho nó hoạt động khi sử dụng mẫu gọi, nhưng không áp dụng mẫu. Chuyện gì vậy? Tôi đang sử dụng XSL 1.0. Vui lòng bỏ qua thực tế là tôi đang chuyển một tham số được mã hóa cứng - đây chỉ là một ví dụ.

Trả lời

5

Hmmm ... thú vị ... không cho tôi sử dụng XslTransformXslCompiledTransform trong .NET - nhưng có vẻ như nó nên hoạt động ... tò mò ...

cập nhật vấn đề phải là gốc đối sánh; hãy thử

<xsl:template match="/catalog"> <!-- CHANGE HERE --> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

Điều này sau đó hoạt động cho tôi mà không có bất kỳ thay đổi nào khác. Sự khác biệt là bạn đã khớp nút gốc. Khi bạn đã thực hiện "áp dụng mẫu", nó đã xếp hàng trước tiên vào danh mục (có tham số), rồi thành cd (không có tham số). Để có được những gì bạn muốn, bạn cần phải bắt đầu tại cửa hàng. Bạn có thể thấy điều này bằng cách thêm một số <xsl:vaue-of select="name()"/> vào trận đấu và sau đó thử làm "/" và "/ danh mục".

+0

có - điều đó có tác dụng nhưng tại sao ví dụ ban đầu không hoạt động !? – Goran

+0

Ahh. Nhưng tại sao không tham số được truyền cho cd? – darasd

+0

danh mục là gốc ở đây, vì vậy ví dụ ban đầu sẽ hoạt động. Và nó có với libXSLT và Opera. – vartec

2

Cố gắng xác định các mẫu để áp dụng:

<xsl:template match="/"> 
    <xsl:apply-templates select="catalog/cd"> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 
+0

didn Không bắt được - hãy thử giải pháp này. Có vẻ như có điều gì đó không ổn định khi không chỉ định đường dẫn mẫu. – Goran

+0

vâng, bạn nói đúng. Howver, tôi tin rằng có // trong lựa chọn là hình thức xấu. Hơn nữa, Có vẻ như dấu gạch chéo kép này là crutial để đi qua các thông số. Trong mã thực của tôi, tôi đã đi qua một nút trong lựa chọn, tuy nhiên, tham số này chỉ được truyền sau khi tiền tố nút có //. TẠI SAO? – darasd

+0

Ok - bây giờ SO là hành xử lạ - câu hỏi này không có 4 câu trả lời cũng chỉnh sửa của bạn được hiển thị và sau đó bị mất ngẫu nhiên ... – Goran

0

trình cho tôi với libxslt 1.1.24 từ http://xmlsoft.org/XSLT/ :

$ xsltproc xml1.xsl xml1.xml 
<?xml version="1.0"?> 


    parameter: 
    has this parameter been passed? 

    parameter: 
    has this parameter been passed? 
+0

thú vị. Tôi đang sử dụng MSXML 4.0. Tuy nhiên, nó cũng không hoạt động khi tôi xem nó trong Firefox. – darasd

+0

Vâng, thất bại với Fx, làm việc với Opera 10. – vartec

0

Tôi thấy sự cố là không có phần tử nào phù hợp cho phần tử cd dưới gốc. Dưới gốc bạn có catalô yếu tố không phải là một cd yếu tố , vì vậy thay đổi mẫu để phù hợp = 'Danh mục'

2

bạn luôn có thể đi với xsl: call-template .. ví dụ:

... 
<xsl:call-template name="foo"> 
    <xsl:with-param name="bars" select="42"/> 
</xsl:call-template> 
... 

<xsl:template name="foo"> 
    <xsl:param name="bars"/> 
    <xsl:value-of select="$node"/> 
</xsl:template> 
Các vấn đề liên quan