使用ant和xslt动态连接xml文件 问题:
我们有大量的xml配置文件,我们希望在构建时将它们合并到一个主版本中。较小的配置文件更容易维护,一个较大的文件加载速度更快,所以我认为这是一个流行的构建转换过程,我会在网上找到很多很好的例子 我能够找到一些很好的解决问题的方法,但它们都依赖于知道需要提前合并的xml文件的名称。这对我来说似乎是不必要的开销。应该可以编写一个构建脚本,该脚本可以动态计算需要哪些输入xml文件 不幸的是,我能找到的实现这一点的唯一方法是一点黑客。它是这样工作的使用ant和xslt动态连接xml文件 问题:,xml,xslt,ant,saxon,Xml,Xslt,Ant,Saxon,我们有大量的xml配置文件,我们希望在构建时将它们合并到一个主版本中。较小的配置文件更容易维护,一个较大的文件加载速度更快,所以我认为这是一个流行的构建转换过程,我会在网上找到很多很好的例子 我能够找到一些很好的解决问题的方法,但它们都依赖于知道需要提前合并的xml文件的名称。这对我来说似乎是不必要的开销。应该可以编写一个构建脚本,该脚本可以动态计算需要哪些输入xml文件 不幸的是,我能找到的实现这一点的唯一方法是一点黑客。它是这样工作的 使用我从互联网上偷来的随机ant任务将目录列表写入xml
<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>
在我对ant脚本做了一些额外的调整后,效果非常好
<taskdef name="saxon-xslt" classname="net.sf.saxon.ant.AntTransform"
classpath="antlib/saxon9.jar;antlib/saxon9-ant.jar"/>
[……]
和xsl样式表(我移动了它)
这些调整只是为了让Saxon9加载并使用参数设置目录
有人找到了更简单的方法吗
实现这一动态发现是什么
要在XSLT中合并的文件?不是
令人惊讶的是XSLT无法读取
但我希望
找到一种更简单的方式通过
文件名列表,而不是通过
另一个xml文件
可以使用XPath 2/0/XSLT 2.0动态发现和处理XML文件。更具体地说,必须使用XPath2.0函数
有关详细信息,请参阅
因此,如果ANT可以使用合适的XSLT 2.0处理器(我建议使用),使用标准函数,问题就有了完整的解决方案
<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>
<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>