由于验证错误

时间:2016-09-22 13:13:06

标签: ant dita

我想从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>元素中。

&#34;容易腻,&#34;我想对自己。所以我使用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。

加载文件会返回错误:

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

如果删除<!DOCTYPE>声明或添加带有DTD路径的嵌套<xmlcatalog>,文件会加载,我可以使用它的属性。

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

如何让Ant服从我的意愿?

1 个答案:

答案 0 :(得分:2)

我建议不要使用<xmlproperty>。请查看docs

  

例如,启用了语义属性处理,这个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获取这些值,然后设置属性。这样,你就可以说,&#34;用简单的//foo[1] XPath选择器给我第一次出现该元素。此外,在设置属性之前,您可以使用XSLT和XPath来切片值,格式化日期等。

<强>更新 您可以使用oops咨询服务Ant xmltask。使用<copy>

设置属性非常简单
<copy path="//critdates/created/@date"
            property="document.date"
            append="false"/>