由于验证错误,Ant xmlproperty 任务失败
Ant xmlproperty task fails due to validation error
我想从 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>
元素中
"Easy peasy,"我心里想。所以我使用 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。
加载文件returns出错:
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服从我的意志?
我建议不要为此使用 <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"/>
我想从 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>
元素中
"Easy peasy,"我心里想。所以我使用 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。
加载文件returns出错:
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服从我的意志?
我建议不要为此使用 <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"/>