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 命令 http://ant.apache.org/manual/Tasks/xslt.html