2009-02-13 5 views
12

Có cách nào để lấy đường dẫn thư mục hiện tại từ trong tệp xslt không?xslt lấy đường dẫn thư mục tệp hiện tại

Cần nó để định vị các tệp xml và xslt khác. Chúng tôi có các thư mục khách hàng khác nhau và sẽ cần tìm thành công các tệp chính xác.

Cheers

Trả lời

6

Bạn có thể gửi mẫu đó vào bảng định kiểu từ bên ngoài bằng cách sử dụng xsl:param. Sau đó, bạn cần phải xác định đường dẫn hiện tại là gì khi gọi ra từ bên ngoài;)

3

không ...
nhưng bạn có thể có thể workaround vấn đề bằng cách sử dụng URL tương đối và/hoặc thông qua các thông số vào stylesheet.

1

Không AFAIK (mặc dù bạn luôn có thể chuyển nó làm tham số cho biến đổi), nhưng tôi không rõ tại sao đường dẫn tương đối lại thắng ' t làm việc cho bạn ở đây.

4

Trong MSXSL trên Windows, bạn có thể dùng một phần mở rộng kịch bản như thế này:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://tempuri.org/msxsl" 
> 

    <msxsl:script language="JScript" implements-prefix="user"> 
<![CDATA[ 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 

function getCurrentPath(){ 
    return fso.GetFolder(".").Path 
} 
]]> 
    </msxsl:script> 

    <xsl:template match="/"> 
    <xsl:value-of select="user:getCurrentPath()"/> 
    </xsl:template> 

</xsl:stylesheet> 

xử lý XSL khác hỗ trợ phương pháp tương tự để sử dụng nguồn lực bên ngoài (ngôn ngữ kịch bản, chức năng thư viện vv), vì vậy đây chỉ là một là thí dụ.

+0

Không chắc chắn tại sao điều này lại bị bỏ phiếu. Nó thực sự hoạt động. – Tomalak

+2

Xin lỗi vì điều đó. Tôi đã bình chọn nó xuống để sử dụng phần mở rộng không chuẩn, nhưng sau khi thêm câu trả lời của tôi, tôi nhận ra rằng tôi đã đề xuất điều tương tự. Tôi nghĩ rằng không có cách 'chuẩn' nào để làm điều đó. (Ngoại trừ sử dụng thông số) –

+0

Cảm ơn bạn đã giải thích lý do của mình, được đánh giá cao. :-) – Tomalak

2

Trong hầu hết bộ xử lý XSLT, bạn có thể thêm các chức năng tùy chỉnh làm tiện ích mở rộng. Ví dụ ở đây là Saxon's documentation cách thực hiện điều đó.

4

Có cách nào để lấy đường dẫn thư mục hiện tại từ trong tệp xslt không?

Cần nó để xác định vị trí xml và xslt khác file

Không cần bất kỳ chức năng mở rộng hoặc thậm chí các thông số để làm điều đó!

Bất kỳ tương URL được sử dụng trong href thuộc tính của một lệnh <xsl:import> hoặc <xsl:include> được giải quyết dựa trên URL của kiểu XSLT hiện tại - nó chỉ cần có một URL, được quy định như vlearly đúng trong câu hỏi trên. Điều này rất thuận tiện trong việc nhập/bao gồm các bảng định kiểu XSLT.

Chức năngdocument()cũng sẽ giải quyết một URL có liên quan theo cách tương tự, do đó làm cho bất kỳ tài liệu XML thêm truy cập sử dụng URL anrelative.

Cuối cùng, đây làan examplecách các cơ sở này đang ồ ạt sử dụng trong một thư viện lớn chức năng XSLT và các mẫu (FXSL 2.x):

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:f="http://fxsl.sf.net/" 
exclude-result-prefixes="xs xdt f" 
> 
<!-- 
     This module contains the FXSL versions of the "standard" XPath functions 

     These are intended as convenience functions, so that they can be passed 
     as parameters to other functions (e.g. to f:zipWith())     
     or curried and passed as parameters (e.g. to f:map())     
--> 

<xsl:import href="func-curry.xsl"/> 
<xsl:import href="func-compose-flist.xsl"/> 

<xsl:import href="func-standardArithmeticXpathFunctions.xsl"/> 
<xsl:import href="func-standardBooleanXpathFunctions.xsl"/> 
<xsl:import href="func-standardStringXpathFunctions.xsl"/> 
<xsl:import href="func-standardNodesXpathFunctions.xsl"/> 
<xsl:import href="func-standardSequencesXpathFunctions.xsl"/> 
<xsl:import href="func-standardAggregateXpathFunctions.xsl"/> 
<xsl:import href="func-standardDateTimeXpathFunctions.xsl"/> 
<xsl:import href="func-standardXSLTXpathFunctions.xsl"/> 
<xsl:import href="func-standardAxisXpathFunctions.xsl"/> 

</xsl:stylesheet> 
+0

Bạn hoàn toàn đúng về nhập khẩu, bao gồm, tài liệu và đường dẫn tương đối. Các tiện ích mở rộng hoặc thông số được đề xuất chỉ để nhận thư mục hiện tại. –

4

này có thể làm việc cho các thiết lập của bạn:

<xsl:value-of select="system-property('user.dir')"/> 

Ví dụ:

<xsl:value-of select="document(concat(system-property('user.dir'),'/',filename,'.xml'))//title[1]"/>