了解 Java 中的 XSLT 處理
1. 概述
XSLT 代表可擴展樣式表語言轉換,是一種基於 XML 的語言,我們可以使用它將一個 XML 文檔轉換為另一個文本文檔。在本文中,我們將討論 XSLT 處理的所有內容,從設置到高級技術。
2.XSLT 基礎知識
XSLT 基於輸入 XML 文檔和 XSLT 樣式表進行操作。 XML 文檔包含需要轉換的數據,而樣式表定義執行轉換的規則。轉換過程涉及將樣式表中的預定義模板應用到輸入 XML 文檔的各個部分。
XSLT 樣式表是一個 XML 文檔,它規定了執行轉換的指導方針和說明。它由元素組成,包括模板、匹配模式和轉換指令。模板定義了 XML 文檔中的不同節點應如何轉換,而匹配模式則確定這些模板應匹配哪些節點。
XSLT 樣式表提供了一系列功能,例如邏輯、循環、變量分配和排序功能。這些功能使開發人員能夠靈活地將 XML 數據轉換為輸出格式。
3. 加載 XML 輸入和 XSLT 樣式表
要在 Java 中執行 XSLT 轉換,讓我們加載輸入 XML 文檔和 XSLT 樣式表:
Source xmlSource = new StreamSource("input.xml");
Source xsltSource = new StreamSource("stylesheet.xslt");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xsltSource);
StreamResult result = new StreamResult("output.html");
transformer.transform(xmlSource, result);
System.out.println("XSLT transformation completed successfully.");
讓我們分解一下上面代碼片段中的代碼。加載 XML 和 XSLT 文檔後,我們使用TransformerFactory.newInstance()
方法創建一個TransformerFactory
。該工廠方法的目的是生成Transformer
的實例,這些實例負責執行轉換過程。
接下來,我們使用StreamSource
來表示包含樣式表的文件來加載 XSLT 樣式表。 TransformerFactory.newTransformer()
方法將此樣式表編譯為Transformer
實例,這使我們能夠執行所需的轉換。
接下來,我們利用另一個StreamSource
來表示當我們指定輸入 XML 文檔時要轉換的 XML 文件。我們創建一個StreamResult
對象來存儲 XSLT 轉換的輸出。在本例中,我們將轉換後的結果保存為名為output.html
的文件。
最後,我們通過調用Transformer
對象的transform()
方法來啟動轉換過程,並將輸入xmlSource
和輸出result
作為參數。 transform()
方法處理我們的輸入 XML 文檔,並應用 XSLT 樣式表中定義的規則來生成輸出,該方法將其存儲在我們的StreamResult
對像中。
3.1.模板在 XSLT 轉換中的作用
除了上述方法之外,我們還可以利用模板來增強 XSLT 轉換。模板提供了 XSLT 樣式表的預編譯表示,與為同一樣式表重複創建新的Transformer
實例相比,它具有性能優勢。
以下是我們如何在 XSLT 處理中使用Templates
:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Source xsltSource = new StreamSource("stylesheet.xslt");
Templates templates = transformerFactory.newTemplates(xsltSource);
Transformer transformer = templates.newTransformer();
Source xmlSource = new StreamSource("input.xml");
Result result = new StreamResult("output.html");
transformer.transform(xmlSource, result);
在這個更新的示例中,我們繼續使用newInstance()
創建一個TransformerFactory
實例。但是,我們現在不直接創建Transformer
實例,而是使用TransformerFactory.newTemplates(xsltSource)
將高級 XSLT 方法編譯為Templates
。然後可以使用這些預編譯模板來創建多個Transformer
實例。
當我們需要使用同一樣式表執行多個轉換時,這種方法具有優勢,因為它避免了重新編譯樣式表的開銷。對templates.newTransformer()
的調用從預編譯的模板創建一個新的Transformer
實例,允許我們像往常一樣執行轉換。
4. 配置轉換參數和選項
執行 XSLT 轉換時,有時我們需要將值傳遞到樣式表或修改轉換的執行方式。我們可以在 Java 中使用javax.xml.transform.Transformer
類來實現這一點。
我們可以使用Transformer.setParameter(String name, Object value)
方法為Transformer
的參數賦值。這裡, name
是指 XSLT 樣式表中指定的參數名稱, value
表示該參數所需的值。
讓我們看一個演示如何分配參數的簡單示例:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xsltSource);
transformer.setParameter("companyName", "Baeldung Corporation");
在此示例中,我們使用setParameter()
方法將companyName
參數設置為“Baeldung Corporation”
。這使我們能夠在轉換過程中向 XSLT 樣式表提供數據。
要修改轉換選項的設置,例如激活輸出縮進或控制輸出轉義,我們可以使用Transformer.setOutputProperty(String name, String value)
等方法。
讓我們看另一個示例,展示如何啟用輸出縮進:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xsltSource);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
在此示例中,我們使用setOutputProperty()
方法將輸出配置為縮進,並將OutputKeys.INDENT
屬性設置為“yes”
。
正如我們在本小節中所看到的,我們可以通過配置參數和選項來根據我們的具體要求自定義轉換過程並控制輸出格式。
5. 結論
在本文中,我們深入研究了使用 Java 進行 XSLT 處理的領域,並探討了其將 XML 文檔轉換為不同格式的功能。通過了解 XSLT 的基礎知識並通過探索各種可用的 Java API 來精通 XPath 表達式,我們釋放了執行高效且有影響力的轉換的潛力。
與往常一樣,代碼可以在 GitHub 上獲取。