2009-02-01 43 views
5

Câu hỏi

Chúng tôi có một số lượng lớn tệp cấu hình xml mà chúng tôi muốn hợp nhất thành một phiên bản chính tại thời gian xây dựng. Các tệp cấu hình nhỏ hơn dễ bảo trì hơn và một tệp lớn tải nhanh hơn nên tôi tưởng tượng đây là một quá trình chuyển đổi xây dựng phổ biến mà tôi sẽ tìm thấy rất nhiều ví dụ hay về mạng.tự động ghép các tệp xml với kiến ​​và xslt

Tôi đã có thể tìm thấy một số giải pháp tốt cho một phần của sự cố here at StackOverflow nhưng tất cả đều dựa vào việc biết tên của các tệp xml cần hợp nhất phía trước. Điều này có vẻ như một chi phí không cần thiết đối với tôi. Nó có thể viết một kịch bản xây dựng mà có thể tự động tính toán các tập tin xml đầu vào là cần thiết.

Thật không may, cách duy nhất tôi có thể tìm thấy để đạt được điều này là một chút hack. Nó hoạt động như thế này,

  1. Sử dụng tác vụ kiến ​​ngẫu nhiên Tôi đã đánh cắp internet để viết danh sách thư mục vào tệp xml.
  2. Nạp tệp xml vào một phép chuyển đổi xslt, sau đó có thể tải danh sách thư mục khác liệt kê các tệp xml được tham chiếu và nối chúng.
  3. Xóa tệp xml tạm thời chứa danh sách thư mục.

Đây là kịch bản kiến ​​

<taskdef name="xml-dir-list" 
    classname="net.matthaynes.xml.dirlist.AntFileListing" 
    classpath="antlib/xml-dir-listing.0.1.jar; 
    antlib/jakarta-regexp-1.5.jar;antlib/log4j-1.2.14.jar"/> 

<macrodef name="build-plugin-xml" description="todo"> 
    <attribute name="pluginName"/> 

    <xml-dir-list depth="0" verbose="false" 
     srcDir="${src.dir}/@{pluginName}/forms/" includesRegEx="\.xml$" 
     destFile="${src.dir}/@{pluginName}/forms/fileList.xml"/> 

    <xslt in="${src.dir}/forms/fileList.xml" 
     out="${src.dir}/@{pluginName}/@{pluginName}_extn.yuix 
     style="${src.dir}/@{pluginName}/forms/extn.yuix.xsl" /> 

    <delete file="${src.dir}/@{pluginName}/forms/fileList.xml"/> 
</macrodef> 

Và đây là các kiểu,

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <Forms applicationId="YFSSYS00011"> 
      <GlobalExtensions> 
       <Tasks/> 
      </GlobalExtensions> 
      <xsl:apply-templates select="directory/file"/> 
     </Forms> 
    </xsl:template> 

    <xsl:template match="file"> 
     <xsl:copy-of select="document(@name)/Forms/Form"/> 
    </xsl:template> 
</xsl:stylesheet> 

Có ai tìm thấy một cách đơn giản để đạt được khám phá năng động này của những tập tin sáp nhập trong XSLT? Thật không ngạc nhiên khi XSLT không thể đọc trực tiếp các thư mục, nhưng tôi đã hy vọng tìm được một cách đơn giản hơn để chuyển vào danh sách các tên tệp hơn là thông qua một tệp xml khác.

Triển khai Giải pháp

Dimitre's solution làm việc rất lớn một khi tôi đã thực hiện một vài tinh chỉnh bổ sung cho các kịch bản kiến,

<taskdef name="saxon-xslt" classname="net.sf.saxon.ant.AntTransform" 
    classpath="antlib/saxon9.jar;antlib/saxon9-ant.jar"/> 

[...]

<macrodef name="build-plugin-xml" description="todo"> 
    <attribute name="pluginName"/> 

    <saxon-xslt 
     in="build.xml" 
     out="${compca.src.dir}/temp/@{pluginName}/@{pluginName}_extn.yuix" 
     style="antscripts/extn.yuix.xsl"> 
    <param name="formsDir" 
     expression="${compca.src.dir}/@{pluginName}/forms/"/> 
    </saxon-xslt> 
</macrodef> 

và xsl stylesheet (mà tôi đã chuyển)

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:param name="formsDir" /> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:template match="/"> 
      <Forms applicationId="YFSSYS00011"> 
       <GlobalExtensions> 
        <Tasks/> 
       </GlobalExtensions> 
       <xsl:apply-templates select= 
        "collection(
        concat('file:///', 
        $formsDir, 
        '?select=*.yuix;recurse=yes;on-error=ignore' 
       ) 
       )/* 
       "/> 
      </Forms> 

     </xsl:template> 

     <xsl:template match="file"> 
      <xsl:copy-of select="/Forms/Form"/> 
     </xsl:template> 
    </xsl:stylesheet> 

Các chỉnh sửa này chỉ là xung quanh việc tải Saxon9 và thiết lập thư mục với tham số.

Trả lời

6

Có ai tìm thấy cách đơn giản hơn để đạt được khám phá động này về những gì tệp để hợp nhất trong XSLT không? Nó không phải là đáng ngạc nhiên khi XSLT không thể đọc trực tiếp thư mục, nhưng tôi hy vọng để tìm cách đơn giản hơn để vượt qua trong một tên tệp hơn thông qua một tệp xml khác.

động phát hiện và xử lý các tập tin XML thể được thực hiện bằng XPath 2/0/XSLT 2.0. Cụ thể hơn, người ta phải sử dụng chức năng XPath 2.0 collection().

Để biết chi tiết, hãy xem my answer to this question.

Vì vậy, nếu ANT có thể sử dụng một phù hợp XSLT 2.0 xử lý, (tôi sẽ khuyên bạn sử dụng Saxon), vấn đề có một giải pháp hoàn chỉnh, bằng cách sử dụng tiêu chuẩn collection() chức năng.

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