Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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将XML文件的结构转换为文件夹结构_Ant_Structure_Directory_Project Setup - Fatal编程技术网

如何使用ANT将XML文件的结构转换为文件夹结构

如何使用ANT将XML文件的结构转换为文件夹结构,ant,structure,directory,project-setup,Ant,Structure,Directory,Project Setup,我希望能够将一个XML文件传递给ANT构建脚本,并让它使用构建文件父目录作为根目录,创建一个模仿XML节点结构的文件夹结构 例如,使用: <root> <folder1> <folder1-1/> </folder1> <folder2/> <folder3> <folder3-1/> </folder3> </root

我希望能够将一个XML文件传递给ANT构建脚本,并让它使用构建文件父目录作为根目录,创建一个模仿XML节点结构的文件夹结构

例如,使用:

<root>
    <folder1>
         <folder1-1/>
    </folder1>
    <folder2/>
    <folder3>
         <folder3-1/>
    </folder3>
</root>

我知道如何创建目录,但我不确定如何让ANT解析XML。

一个选项是使用xslt任务来完成繁重的工作。例如,生成第二个ant脚本并调用它

build.xml:

<project default="mkdirs">
  <target name="mkdirs">
    <xslt style="mkdir.xslt" in="dirs.xml" out="mkdir.build.xml"/>
    <ant antfile="mkdir.build.xml"/>
  </target>
</project>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="text()"/>

  <xsl:template match="root">
    <project><xsl:text>&#10;</xsl:text>
      <xsl:apply-templates/>
    </project>
  </xsl:template>

  <xsl:template match="*">
    <mkdir>
      <xsl:attribute name="dir">
        <xsl:for-each select="ancestor::*">
          <xsl:if test="position() != 1">
            <xsl:value-of select="name()"/>
            <xsl:text>/</xsl:text>
          </xsl:if>
        </xsl:for-each>
        <xsl:value-of select="name()"/>
      </xsl:attribute>
    </mkdir><xsl:text>&#10;</xsl:text>

    <xsl:apply-templates/>
  </xsl:template>
</xsl:transform>

将mkdir.xslt与build.xml放在同一目录中:

<project default="mkdirs">
  <target name="mkdirs">
    <xslt style="mkdir.xslt" in="dirs.xml" out="mkdir.build.xml"/>
    <ant antfile="mkdir.build.xml"/>
  </target>
</project>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="text()"/>

  <xsl:template match="root">
    <project><xsl:text>&#10;</xsl:text>
      <xsl:apply-templates/>
    </project>
  </xsl:template>

  <xsl:template match="*">
    <mkdir>
      <xsl:attribute name="dir">
        <xsl:for-each select="ancestor::*">
          <xsl:if test="position() != 1">
            <xsl:value-of select="name()"/>
            <xsl:text>/</xsl:text>
          </xsl:if>
        </xsl:for-each>
        <xsl:value-of select="name()"/>
      </xsl:attribute>
    </mkdir><xsl:text>&#10;</xsl:text>

    <xsl:apply-templates/>
  </xsl:template>
</xsl:transform>



/


xslt任务的mkdir.build.xml输出示例:

<?xml version="1.0" encoding="UTF-8"?><project>
<mkdir dir="folder1"/>
<mkdir dir="folder1/folder1-1"/>
<mkdir dir="folder2"/>
<mkdir dir="folder3"/>
<mkdir dir="folder3/folder3-1"/>
</project>

我不精通XSLT,因此可能需要改进for-each循环