2008-09-19 39 views
6

Trong tài liệu XSLT, có thể lặp qua một tập hợp các tệp trong thư mục hiện tại không?Nhiều đầu vào tệp?

Tôi có một tình huống mà tôi có một thư mục đầy đủ các file xml mà cần một số phân tích được thực hiện để tạo ra một báo cáo. Tôi có biểu định kiểu của tôi hoạt động trên một tài liệu duy nhất tốt, nhưng tôi muốn mở rộng mà không đi đến một công cụ khác để hợp nhất các tài liệu xml.

Tôi đã suy nghĩ cùng những dòng này:

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

Trả lời

8

Trong XSLT 2.0, và với Saxon, bạn có thể làm điều này với các chức năng collection():

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

Xem http://www.saxonica.com/documentation/sourcedocs/collections.html để biết thêm chi tiết .

Trong XSLT 1.0, bạn phải tạo một danh mục liệt kê các tài liệu mà bạn muốn xử lý với một công cụ riêng biệt. Môi trường của bạn có thể cung cấp một công cụ như vậy; ví dụ, Cocoon có một Directory Generator tạo ra một chỉ mục như vậy. Nhưng không biết môi trường của bạn là gì, thật khó để biết nên giới thiệu gì.

0

Tôi không nghĩ rằng XSL được thiết lập để làm việc theo cách đó: nó được thiết kế để được sử dụng bởi một cái gì đó khác trên một hoặc nhiều tài liệu, và cái gì khác sẽ chịu trách nhiệm tìm các tệp mà XSLT sẽ được áp dụng.

Nếu bạn có một tài liệu chính và một bộ tài liệu hỗ trợ cố định, bạn có thể sử dụng document() function để trả lại các nút và/hoặc giá trị cụ thể, nhưng tôi nghi ngờ trường hợp của bạn khác.

0

Từ bên trong XSLT Tôi nghĩ điều này sẽ không thể thực hiện được.

Bạn có thể chuyển tất cả tên tệp XML vào một danh sách được phân cách bằng dấu phẩy và lặp qua nó bằng cách sử dụng đệ quy và chuỗi con trước() và chuỗi con sau().

0

Tôi có một công cụ dòng lệnh có thể được sử dụng cho điều này - nó sử dụng bộ xử lý XSLT xây dựng vào Ant (java công cụ xây dựng) để xử lý đầu vào + biến thành đầu ra. Sẽ được dễ dàng để bọc với một tập tin thực thi cho vòng lặp.

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

2

Như những người khác nói, bạn không thể làm điều đó một cách nền tảng độc lập. Trong thế giới .NET, bạn có thể tạo một XmlResolver tùy chỉnh để tài liệu ('dir: // c:/foo /') sẽ trả về danh sách các tệp trong thư mục 'c: \ foo' ở định dạng tùy ý mà bạn muốn. Xem các liên kết sau để biết thêm thông tin về tùy chỉnh XmlResolver của:

Customizing the XmlUrlResolver Class
The power of XmlResolver

Ngoài ra bạn có thể nghỉ mát để sử dụng các kịch bản (như phần tử msxsl:script) hoặc phần mở rộng trong kiểu XSLT của bạn.

Tất cả những phương pháp sẽ làm cho mã XSLT của bạn unportable đến các nền tảng khác.

0

Nếu bạn đang sử dụng Net bạn có thể sử dụng XsltExtension để thực hiện cuộc gọi từ tài liệu XSLT của bạn với các phương pháp trong lớp .net bạn. Phương thức này sau đó có thể trả về các nút trở lại XSLT của bạn. Vì vậy, phương pháp của bạn có thể xử lý phần IO của tệp.

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