Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ant和xslt动态连接xml文件 问题:_Xml_Xslt_Ant_Saxon - Fatal编程技术网

使用ant和xslt动态连接xml文件 问题:

使用ant和xslt动态连接xml文件 问题:,xml,xslt,ant,saxon,Xml,Xslt,Ant,Saxon,我们有大量的xml配置文件,我们希望在构建时将它们合并到一个主版本中。较小的配置文件更容易维护,一个较大的文件加载速度更快,所以我认为这是一个流行的构建转换过程,我会在网上找到很多很好的例子 我能够找到一些很好的解决问题的方法,但它们都依赖于知道需要提前合并的xml文件的名称。这对我来说似乎是不必要的开销。应该可以编写一个构建脚本,该脚本可以动态计算需要哪些输入xml文件 不幸的是,我能找到的实现这一点的唯一方法是一点黑客。它是这样工作的 使用我从互联网上偷来的随机ant任务将目录列表写入xml

我们有大量的xml配置文件,我们希望在构建时将它们合并到一个主版本中。较小的配置文件更容易维护,一个较大的文件加载速度更快,所以我认为这是一个流行的构建转换过程,我会在网上找到很多很好的例子

我能够找到一些很好的解决问题的方法,但它们都依赖于知道需要提前合并的xml文件的名称。这对我来说似乎是不必要的开销。应该可以编写一个构建脚本,该脚本可以动态计算需要哪些输入xml文件

不幸的是,我能找到的实现这一点的唯一方法是一点黑客。它是这样工作的

  • 使用我从互联网上偷来的随机ant任务将目录列表写入xml文件
  • 将xml文件馈送到xslt转换中,然后可以加载列出引用的xml文件的其他目录并连接它们
  • 删除包含目录列表的临时xml文件
  • 这是ant脚本

    <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>