我想从DITA映射文件中提取一个应用程序版本。ditamap文件是有效的,看起来像这样:
<?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>
元素中。
<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。
加载文件返回错误:
java.io.FileNotFoundException: /home/user/user-manual/map.dtd (No such file or directory)
如果我删除<!DOCTYPE>
声明或添加一个嵌套的<xmlcatalog>
与路径到DTD,文件加载,我可以使用它的属性。
我在Ant 1.7.1和1.9.4中对此进行了测试。这是Ant的一个bug,还是我误解了Ant加载XML属性和validate
属性的目的?
我怎样才能使蚂蚁服从我的意志?
我建议不要使用<xmlproperty>
。请查看文档:
例如,启用语义属性处理后,这个XML属性文件:
<root>
<properties>
<foo location="bar"/>
<quux>${root.properties.foo}</quux>
</properties>
</root>
大致相当于build.xml文件中的以下片段:
<property name="root.properties.foo" location="bar"/>
<property name="root.properties.quux" value="${root.properties.foo}"/>
因此,您设置的属性的名称是使用它们到根元素的路径生成的,因此它们依赖于DITA Map的结构。但是DITA中的许多元素可能被设置在DITA Map上的不同位置。这意味着,如果将元数据移动到另一个父元素,属性名称就会更改,构建就会失败。这可能不是你想要的。
我建议通过XSLT获取这些值,然后设置属性。这样,例如,您可以说"使用简单的//foo[1]
XPath选择器为我提供该元素的第一个出现项"。此外,您还可以使用XSLT和XPath在设置属性之前对值进行切片、格式化日期等操作。
您可以使用oops咨询antxmltask。使用<copy>
:
<copy path="//critdates/created/@date"
property="document.date"
append="false"/>