2011-05-14 64 views
2

我有合并外部文档的XSL样式表,这样
<xsl:copy-of select="document('snippets.xml')/snippets/xxxx/form"/>蚂蚁XSLT任务的基础上多发的依赖

我想的是,XSLT Ant构建任务重建,如果其依赖的文件或任何改变。

当前的Ant任务看起来像这样
<xslt basedir="xxxx/pages/${doc.locale}"
destdir="xxxx/dir/${doc.locale}"
includes="*.xml"
excludes="snippets.xml"
style="build/xxxx/${doc.locale}/myStyle.xsl">
<param name="lang" expression="${doc.locale}"/>
<xmlcatalog refid="docDTDs"/>

基本上我想如果snippets.xml文件更改为重建。

+1

看一看设置你的XSLT任务可以检查对一个属性'uptodate'任务。目前还不清楚问题的确切依赖关系是什么,但'uptodate'是当想要基于文件时间戳进行条件化处理时使用的Ant任务。 – ewh 2011-05-14 20:48:27

+0

我的文件依赖于snippets.xml。你能详细阐述一下'uptodate'的用法,因为我很难理解如何使用它。我不是蚂蚁专家。 – millebii 2011-05-15 20:06:42

+0

我发布了一个提供'uptodate'示例的答案。它可能不完整,因为我还不清楚文件依赖关系可能是什么。 – ewh 2011-05-16 03:31:56

回答

2

Ant有uptodate任务,用于检查目标是否来自一组源文件的最新文件modtime-wise。由于XSLT任务可能会创建多个文件(导致多个目标),或者它创建了单个文件,所以我并不完全清楚您的依赖关系。您的一条评论意味着一个文件。

以下是使用uptodate的一种方法。你基本上使用的任务设置,然后可以放在一个目标unless属性的属性:

<property name="file.that.depends.on.snippets" 
      location="some/path"/> 
<property name="snippets.file" 
      location="xxxx/pages/${doc.locale}/snippets.xml"/> 

<target name="process-snippets" 
     unless="snippets.uptodate" 
     depends="snippets-uptodate-check"> 
    <xslt basedir="xxxx/pages/${doc.locale}" 
     destdir="xxxx/dir/${doc.locale}" 
     includes="*.xml" 
     excludes="snippets.xml" 
     style="build/xxxx/${doc.locale}/myStyle.xsl"> 
    <param name="lang" expression="${doc.locale}"/> 
    <xmlcatalog refid="docDTDs"/> 
    </xslt> 
</target> 

<target name="snippets-uptodate-check"> 
    <uptodate property="snippets.uptodate" 
      targetfile="$file.that.depends.on.snippets"> 
    <srcfiles dir="xxxx/pages/${doc.locale}" 
       includes="*.xml" 
       excludes="snippets.xml"/> 

    </uptodate> 
</target> 
+0

我想我明白了。将在我工作时报告。 – millebii 2011-05-16 06:33:14

+0

得到它在xslt basedir中为单个文件工作。我需要将此应用于该目录中的所有'* .xml'。所以我需要解决''的隐式文件集 – millebii 2011-05-16 12:46:12

-1

XSLT task应该为你默认做这个。它有一个可选的“力量”属性

重新创建目标文件,即使他们 比其相应的 源文件或样式表

其默认为false更新。所以默认情况下,除非用“force”属性覆盖,否则XSLT任务会检查依赖关系。

+0

问题是XSLT使用'document()'函数,而ANT''任务不知道要查看动态加载的资源,以确定它是否应该执行。您可以使用'@ force',但如果没有资源文件发生更改,则会不必要地生成输出。 – 2011-05-15 02:01:06

+0

根本不回答问题,因为它意味着不检查任何内容。 – millebii 2011-05-16 06:34:39

+0

@millebii,我想你错过了我的观点。我并不是说你应该使用“force”属性,这确实意味着不检查任何东西。我指出的是,默认行为是相反的 - 默认情况下检查依赖关系。但我发现在你的情况下,这种行为被使用document()函数所破坏。 – sudocode 2011-05-16 08:38:10