Apache Ant/XSLT
Apache Ant 拥有一个名为 <xslt>(或其同义词 <style>)的任务,用于对文件或文件组执行 XML 转换。
以下是一个示例 XML 转换目标
<target name="MyXSLT">
<xslt in="MyInput.xml"
out="MyOutput.xml"
style="MyTransform.xslt">
</xslt>
</target>
在 ant 目标中,必须指定三个文件
- in 源 XML 输入文件的名称
- out XML 输出文件的名称
- style XSLT 文件的名称
要测试这一点,您可以创建一个“虚拟”输入文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Input>Hi</Input>
</root>
首先,这是一个小的“Hello World”转换文件。转换会查找输入文件的根数据元素,但实际上不会处理任何输入文件数据元素
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<MyMessage>Hello World!</MyMessage>
</xsl:template>
</xsl:stylesheet>
现在您可以从命令行执行此操作。以下是在 Microsoft Windows 命令 shell 中运行的示例
C:\XMLClass\XSLT\Lab1>ant Buildfile: build.xml MyXSLT: [xslt] Processing C:\XMLClass\XSLT\Lab1\MyInput.xml to C:\XMLClass\XSLT\Lab 1\MyOutput.xml [xslt] Loading stylesheet C:\XMLClass\XSLT\Lab1\MyTransform.xslt BUILD SUCCESSFUL Total time: 1 second
输出将出现在名为 MyOutput.xml 的文件中
<?xml version="1.0" encoding="UTF-8"?>
<MyMessage>Hello World!</MyMessage>
有时您可能需要转换包含外部引用的 XML 文件,例如 DTD 或模式定义中的 URL。
通常,无法完全禁用对这些外部文件的解析或验证。例如,Saxon 即使在禁用解析的情况下也会想要读取 DTD(参数“-dtd:off”或等效项)。
在这种情况下,开发工作站可能连接到受防火墙保护的公司内部网,需要某种代理或 socks 配置。
在这些情况下,成功执行转换的唯一解决方案是将此连接配置添加到 ant 脚本中。
示例(摘自更大的 build.xml 文件)
<target name="xdoclet-merge-top" depends="init, proxy-set" >
<xslt style="${XDocletDescDir}/merge.xslt"
in="${XDocletDescDir}/merge1.xml"
out="${XDocletDescDir}/jboss-2.xml" force="true" >
<classpath location="${ZubehoerDir}/SaxonHE9-4-0-1J/saxon9he.jar" />
</xslt>
</target>
<target name="proxy-set">
<setproxy proxyhost="proxy.mynet.de" proxyport="8080" proxyuser="" proxypassword=""/>
</target>
您还可以将参数从 ant 构建文件传递到 XSLT。如果您需要使用少量变化运行相同的转换,这将非常有用。只需将param
标签添加到 <xslt> 目标即可
<param name="MyParameter" expression="ANT AND XSLT ROCK"/>
现在 ant 任务看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<project default="MyXSLT">
<target name="MyXSLT">
<xslt
in="MyInput.xml"
out="MyOutput.xml"
style="MyTransform.xslt">
<param name="MyParameter" expression="ANT AND XSLT ROCK"/>
</xslt>
</target>
</project>
以下是一个接受单个输入参数的示例转换
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="MyParameter"/>
<xsl:template match="/">
<MyMessages>
<MyMessage>Hello From XSLT</MyMessage>
<MyMessage>From input: <xsl:value-of select="/root/Input"/>
</MyMessage>
<MyMessage>
<xsl:value-of select="$MyParameter"/>
</MyMessage>
</MyMessages>
</xsl:template>
</xsl:stylesheet>
这将创建以下输出
<?xml version="1.0" encoding="UTF-8"?>
<MyMessages>
<MyMessage>Hello From XSLT</MyMessage>
<MyMessage>From input: Hi</MyMessage>
<MyMessage>ANT AND XSLT ROCK</MyMessage>
</MyMessages>
请注意,有三行不同。一行来自转换文件,一行来自输入 XML 文件,另一行直接从 ant 文件中传递。
默认情况下,XSLT 任务将检查文件时间戳,以查看输出文件是否比输入文件更新。如果输出更新,则任务无需重新运行转换。但有时转换会导入其他转换文件,而 Ant 不会检查导入文件的 timestamps。(也许将来会添加该选项。)但并非所有都已丢失。我们可以使用 <dependset> 标签获得相同的结果。以下是一个示例
<dependset>
<srcfilelist dir="${XSLTDir}"
files="Content2HTML.xsl, HTMLHeader.xsl,PageHeader.xsl,LeftNav.xsl,PageFooter.xsl"/>
<targetfileset
dir="${BuildDir}"
includes="*.htm"/>
</dependset>
在上面的示例中,源转换 (Content2HTML.xsl) 导入位于 XSLTDir 目录中的另外四个页面片段转换 (HTMLHeader.xsl、PageHeader.xsl、LeftNav.xsl 和 PageFooter.xsl)。它在 BuildDir 目录中创建了文件。如果任何输入文件发生更改,将重新生成输出。
这是一种构建基于 ant 的小型 Web 内容管理系统的便捷方法。您只需将 HTML 内容放在一个目录中,转换就可以将 HTML 标题、导航栏和页脚包装在您的内容周围。每个页面的 HTML 可以只是一个 <div> 部分,该部分使用 <xsl:copy-of> 命令复制到输出中。
- Apache Ant XSLT 命令 https://ant.apache.ac.cn/manual/Tasks/xslt.html