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,
- 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.
- 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.
- 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ố.