2008-09-19 75 views
6

在XSLT文檔中,是否可以遍歷當前目錄中的一組文件?多個文件輸入?

我有一個情況,我有一個目錄充滿xml文件,需要做一些分析來生成報告。我的樣式表在單個文檔上運行良好,但是我想擴展該樣式表而不用另一個工具來合併xml文檔。

我是基於這樣的思考:

<xsl:for-each select="{IO Selector Here}"> 
    <xsl:variable select="document(@url)" name="contents" /> 
    <!--More stuff here--> 
</xsl:for-each> 

回答

8

在XSLT 2.0,並與撒克遜人,你可以用collection()功能做到這一點:

<xsl:for-each select="file:///path/to/directory"> 
    <!-- process the documents --> 
</xsl:for-each> 

詳情請參閱http://www.saxonica.com/documentation/sourcedocs/collections.html

在XSLT 1.0中,您必須創建一個索引來列出要使用單獨工具處理的文檔。你的環境可能提供這樣的工具;例如,Cocoon有一個Directory Generator,它創建了這樣一個索引。但不知道你的環境是什麼,很難知道推薦什麼。

0

我不認爲XSL設置爲工作方式:它的目的是通過在一個或多個文檔別的東西可以使用,而其他的東西將負責查找應該使用XSLT的文件。

如果您有一個主文檔和一組固定的支持文檔,您可以使用document() function返回特定節點和/或值,但我懷疑您的情況有所不同。

0

從XSLT內部我認爲這是不可能的。

您可以將所有XML文件名傳遞給< xsl:param name =「files」/ >作爲逗號分隔列表並使用遞歸和substring-before()和substring-after()循環。

0

我有一個可用於此的命令行工具 - 它使用內置於Ant(Java構建工具)中的XSLT處理器來處理輸入+轉換爲輸出。使用循環的批處理文件很容易。

的svn://donie.homeip.net/public/tools

2

正如其他人所說,你不能以平臺無關的方式做到這一點。在.NET世界中,您可以創建一個自定義的XmlResolver,以便文檔('dir:// c:/ foo /')以您希望的任意格式返回'c:\ foo'目錄中的文件列表。更多信息請參見自定義的XmlResolver的以下鏈接:

Customizing the XmlUrlResolver Class
The power of XmlResolver

你也可以求助於使用腳本(如msxsl:script元素)或擴展的XSLT樣式表。

所有這些方法都會使您的XSLT代碼無法移植到其他平臺。

0

如果您使用的是.Net,則可以使用XsltExtension從您的XSLT文檔調用.NET類中的方法。該方法可以將節點集返回給您的XSLT。所以你的方法可以處理文件IO部分。