跳轉到內容

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> 命令複製到輸出中。

參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書