2011-10-06 34 views
5

Tôi đang thực hiện một XSLT chuyển đổi từ bên trong ứng dụng web java của tôi không có vấn đề như sau:Execute XSLT Chuyển đổi từ Java với tham số

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource); 
transformer.transform(xmlInput, xmlOutput); 

Trong XSLT tôi transform Tôi bây giờ thêm một cuộc gọi đến document() chức năng để tải phản hồi từ một dịch vụ web RESTful:

<!-- do stuff --> 
<xsl:variable name="url"> 
    http://server/service?id=<xsl:value-of select="@id"/> 
</xsl:variable> 
<xsl:call-template name="doMoreStuff"> 
    <xsl:with-param name="param1" select="document($url)/foo"/> 
</xsl:call-template> 

Ok, không sao cả. Nhưng bây giờ, tôi muốn đọc URL cơ sở từ một lớp utils trong java và chuyển nó vào biểu định kiểu.

//java 
String baseUrl = myUtils.getBaseUrl(); 

<!-- xslt --> 
<xsl:variable name="url"> 
    <xsl:value-of select="$baseUrl"/> 
    <xsl:text>/service?id=</xsl:text> 
    <xsl:value-of select="@id"/> 
</xsl:variable> 

Bất kỳ đề xuất nào về cách thực hiện việc này? Lớp utils Java của tôi tải giá trị từ tệp myApp.properties trên đường dẫn lớp, nhưng tôi không chắc mình có thể sử dụng nó từ XSLT ...

Trả lời

6

Khai báo một xsl:param trong stylesheet của bạn, do đó giá trị baseUrl thể được thông qua vào thời gian gọi:

<xsl:param name="baseUrl" /> 

Set các thông số trên Transformer đối tượng:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource); 
transformer.setParameter('baseUrl', myUtils.getBaseUrl()); 
transformer.transform(xmlInput, xmlOutput); 

Nếu bạn đang sử dụng XSLT 2.0, sau đó bạn có thể xem xét sử dụng resolve-uri() chức năng khi bạn đang xây dựng url giá trị biến:

<xsl:variable name="url" 
       select="resolve-uri(concat('/service?id=', @id), $baseUrl)" /> 

resolve-uri() có thể giúp bù đắp cho trailing dấu gạch chéo, hashtags, và những thứ khác trong baseUrl mà nếu không có thể dẫn đến một URL không hợp lệ được xây dựng bởi chỉ cần ghép nối $baseUrl với đoạn và @id.

+0

Quan trọng cần lưu ý rằng '' phải được khai báo ở cấp cao nhất của biểu định kiểu. Nếu bạn khai báo nó trong một khuôn mẫu, nó sẽ được coi là tham số cho khuôn mẫu chứ không phải toàn bộ biểu định kiểu. – karl

6

Gọi setParameter trên cá thể Biến áp của bạn, với tên và giá trị của tham số. Sau đó, bên trong tài liệu XSLT của bạn khai báo tham số sử dụng <xsl:param name="yourParamName" /> và sau đó bạn có thể sử dụng nó trong XSLT của bạn ví dụ như sau: <xsl:value-of select="$yourParamName" />

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