Java中的XSL转换:一种简单的方法
XSL轉(zhuǎn)換 (XSLT)是將一個(gè)XML文檔轉(zhuǎn)換為另一個(gè)XML文檔的強(qiáng)大機(jī)制。 但是,在Java中,XML操作相當(dāng)冗長和復(fù)雜。 即使是簡單的XSL轉(zhuǎn)換,也必須編寫幾十行代碼—如果需要適當(dāng)?shù)漠惓L幚砗腿罩居涗?#xff0c;甚至可能還要寫更多的代碼。 jcabi-xml是一個(gè)小型開放源代碼庫,它通過使用一些簡單的方法啟用XML解析和XPath遍歷,使生活變得更加輕松。 讓我們看看該庫如何幫助XSL轉(zhuǎn)換。
首先,看一個(gè)實(shí)際的示例— rultor.com ,這是一個(gè)托管的DevOps助手,可自動(dòng)執(zhí)行發(fā)布,合并和部署操作。 Rultor在DynamoDB記錄中與最終用戶保持每次對(duì)話會(huì)話(也稱為“對(duì)話”)。 每次談話有多種情況需要處理。 這就是為什么使用記錄的多列實(shí)際上不可行的原因。 相反,我們只將每個(gè)對(duì)話的幾個(gè)參數(shù)保留在記錄列中(例如ID和名稱),并將所有其余參數(shù)放在一個(gè)XML列中。
這大約是我們的DynamoDB表的外觀:
+----+---------------+--------------------------------------+ | id | name | xml | +----+---------------+--------------------------------------+ | 12 | jcabi-xml#54 | <?xml version='1.0'?> | | | | <talk public="true"> | | | | <request id="e5f4b3">...</request> | | | | </talk> | +----+---------------+--------------------------------------+ | 13 | jcabi-email#2 | <?xml version='1.0'?> | | | | <talk public="true"> | | | | <daemon id="f787fe">...</daemon> | | | | </talk> | +----+---------------+--------------------------------------+用戶將@rultor status到Github票證后,Rultor必須回答有關(guān)當(dāng)前談話的完整狀態(tài)報(bào)告。 為了創(chuàng)建這樣的文本答案(普通用戶不會(huì)喜歡XML響應(yīng)),我們必須從必要的DynamoDB記錄中獲取該xml列,并將其轉(zhuǎn)換為純英文文本。
這是我們在jcabi-xml及其類XSLDocument的幫助下進(jìn)行的 。
final String xml = // comes from DynamoDB final XSL xsl = new XSLDocument(this.getClass().getResourceAsStream("status.xsl") ); final String text = xsl.applyTo(xml);而已。 現(xiàn)在,讓我們看一下status.xsl文件中的內(nèi)容(這只是它的骨架;完整版本在這里 ):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"><xsl:output method="text"/><xsl:template match="/talk"><xsl:text>Hi, here is your status report:</xsl:text>...</xsl:template><xsl:template match="node()|@*"><xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy></xsl:template> </xsl:stylesheet>優(yōu)良作法是每個(gè)應(yīng)用程序運(yùn)行僅創(chuàng)建一次XSL文檔。 我們有一個(gè)靜態(tài)實(shí)用程序方法XSLDocument.make() :
final class Foo {private static final XSL STYLESHEET = XSLDocument.make(Foo.class.getResourceAsStream("stylesheet.xsl"));public XML style(final XML xml) {return Foo.STYLESHEET.transform(xml);} }請(qǐng)注意我們正在使用XSLT 2.0的事實(shí)。 XSLT的內(nèi)置Java實(shí)現(xiàn)不支持2.0版,為了使其運(yùn)行,我們使用了以下兩個(gè)Maven Saxon依賴項(xiàng):
<dependency><groupId>net.sourceforge.saxon</groupId><artifactId>saxon</artifactId><version>9.1.0.8</version><scope>runtime</scope> </dependency> <dependency><groupId>net.sourceforge.saxon</groupId><artifactId>saxon</artifactId><version>9.1.0.8</version><classifier>xpath</classifier><scope>runtime</scope> </dependency>開始使用jcabi-xml進(jìn)行XSL轉(zhuǎn)換所需要做的就是將此依賴項(xiàng)添加到pom.xml :
<dependency><groupId>com.jcabi</groupId><artifactId>jcabi-xml</artifactId> </dependency>如果您有任何問題或建議,請(qǐng)隨時(shí)將問題提交給Github 問題跟蹤器 。
翻譯自: https://www.javacodegeeks.com/2015/02/xsl-transformation-java-easy-way.html
總結(jié)
以上是生活随笔為你收集整理的Java中的XSL转换:一种简单的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8函数式编程:延迟实例化
- 下一篇: Java中连接字符串的最佳方法