2016-09-22 89 views
2

我想从DITA映射文件中提取应用程序版本。该ditamap文件是有效的,看起来像这样:Ant xmlproperty任务由于验证错误而失败

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd"> 
<map id="user-manual"> 
    <title><ph keyref="product"/> User Manual</title> 
    <topicmeta> 
     <prodinfo> 
      <prodname><keyword keyref="product"/></prodname> 
      <vrmlist> 
       <vrm version="4" release="3" modification="0"/> 
      </vrmlist> 
     </prodinfo> 
    </topicmeta> 
    <!-- 
     [...] 
    --> 
</map> 

我想要得到的信息是在<vrm>元素。

“轻松的心情”,我想我自己。所以我使用Ant的<xmlproperty>任务来加载这个XML文件。

<project default="test"> 
    <!-- notice @validate --> 
    <xmlproperty file="path/to/user-manual.ditamap" validate="false"/> 
    <target name="test"> 
     <echo>${map.topicmeta.prodinfo.vrmlist.vrm(version)}</echo> 
    </target> 
</project> 

我不希望它验证,因为Ant不会找到map.dtd。如果我删除<!DOCTYPE>声明或与路径添加一个嵌套<xmlcatalog>的DTD,文件加载,我可以从它使用属性

java.io.FileNotFoundException: /home/user/user-manual/map.dtd (No such file or directory) 

加载文件返回一个错误。

我用Ant 1.7.1和1.9.4测试了这个。这是Ant的错误,还是我误解了Ant如何加载XML属性以及validate属性的用途?

我该如何让蚂蚁服从我的意志?

回答

2

我建议不要为此使用<xmlproperty>。请看看在docs

For example, with semantic attribute processing enabled, this XML property file:

<root> 
    <properties> 
    <foo location="bar"/> 
    <quux>${root.properties.foo}</quux> 
    </properties> 
</root> 

is roughly equivalent to the following fragments in a build.xml file:

<property name="root.properties.foo" location="bar"/> 
<property name="root.properties.quux" value="${root.properties.foo}"/> 

这样的属性设置使用其路径的根元素生成的,所以他们依靠的结构名称的DITA地图。但DITA中的许多元素可能会设置在DITA Map上的不同位置。这意味着,如果将元数据移动到另一个父元素,则属性名称会更改,并且构建失败。这可能不是,你想要的。

我建议通过XSLT获取这些值并设置属性。例如,你可以这样说:“给我一个简单的//foo[1] XPath选择器的第一个元素,进一步说,你有权利XSLT和XPath切片值,格式化日期等等,然后设置一个。酒店

更新 可以使用哎呀咨询蚂蚁xmltask的,这是很容易使用<copy>设置属性:。

<copy path="//critdates/created/@date" 
      property="document.date" 
      append="false"/> 
+0

好点使用Ant的XSLT任务,生活的最好方式要做到这一点是使用xslt任务来创建一个临时的XML属性文件,然后加载?或者你推荐一个不同的方法? – Scribblemacher

+0

我更新了我的答案 –