跳转到内容

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 XSLT 转换

[编辑 | 编辑源代码]

首先,这是一个小的“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 脚本

[编辑 | 编辑源代码]

您还可以将参数从 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 文件中传递。

在 Apache Ant 中使用 XSLT 的其他方法

[编辑 | 编辑源代码]

检查依赖项

[编辑 | 编辑源代码]

默认情况下,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> 命令复制到输出中。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书