Ant xmlproperty 任务由于验证错误而失败

标签 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>元素。

“简单,”我心里想。所以我用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>声明或添加嵌套 <xmlcatalog>通过 DTD 的路径,文件将加载,我可以使用其中的属性。

我用 Ant 1.7.1 和 1.9.4 对此进行了测试。这是 Ant 的 bug,还是我误解了 Ant 加载 XML 属性的方式以及 validate 的目的属性?

如何让 Ant 服从我的意志?

最佳答案

我建议不要使用 <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 映射上的不同位置。这意味着,如果您将元数据移动到另一个父元素,属性名称会发生​​更改,并且构建会失败。这可能不是您想要的。

我建议通过 XSLT 获取这些值,然后设置属性。这样,您可以说,“使用简单的 //foo[1] XPath 选择器给我该元素的第一次出现。此外,您还可以使用 XSLT 和 XPath 来对值进行切片、格式化日期等。设置属性。

更新 您可以使用oops咨询Ant xmltask为了那个原因。使用 <copy> 设置属性非常容易:

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

关于Ant xmlproperty 任务由于验证错误而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39640092/

相关文章:

java - 访问 Web 应用程序类路径上的资源

xml - 在 XSL 文档中添加外部图形的相对路径?

xml - XSLT 从多个模板匹配写入相同的属性

XSLT:将以下标题标签的同级移动到单独的主题中

xslt - 使用 h2d.xsl 将 HTML 转换为 DITA

java - Ant 在 Java 工作区中构建 ArrayIndexOutOfBoundsException

ant - Jenkins:具有多个颠覆模块的单一作业

android - 在 Cordova v-5.0 CLI 中签名 APK 文件不起作用

android - proguard Android项目时出错

java - DITA Open Toolkit 的开源替代品